mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 22:00:10 +00:00
95ef556bd1
DetectionContext objects are stored as values in a DenseMap. When the DenseMap reaches its maximum load factor, it is resized and all its objects moved to a new memory allocation. Unfortunately Scop object have a reference to its DetectionContext. When the DenseMap resizes, all the DetectionContexts reference now point to invalid memory, even if caused by an unrelated DetectionContext. Even worse, NewPM's ScopPassManager called isMaxRegionInScop with the Verify=true parameter before each pass. This caused the old DetectionContext to be removed an a new on created and re-verified. Of course, the Scop object was already created pointing to the old DetectionContext. Because the new DetectionContext would usually be stored at the same position in the DenseMap, the reference would usually reference the new DetectionContext of the same Region. Usually. If not, the old position still points to memory in the DenseMap allocation (unless also a resizing occurs) such that tools like Valgrind and AddressSanitizer would not be able to diagnose this. Instead of storing the DetectionContext inside the DenseMap, use a std::unique_ptr to a DetectionContext allocation, i.e. it will not move around anymore. This also allows use to remove the very strange DetectionContext(const DetectionContext &&) copy/move(?) constructor. DetectionContext objects now are neither copied nor moved. As a result, every re-verification of a DetectionContext will use a new allocation. Therefore, once a Scop object has been created using a DetectionContext, it must not be re-verified (the Scop data structure requires its underlying Region to not change before code generation anyway). The NewPM may call isMaxRegionInScop only with Validate=false parameter. |
||
---|---|---|
.. | ||
Analysis | ||
CodeGen | ||
Exchange | ||
External | ||
Plugin | ||
Support | ||
Transform | ||
CMakeLists.txt |