[PATCH] D112621: [analyzer][solver] Introduce reasoning for not equal to operator
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 30 06:37:37 PST 2021
steakhal requested changes to this revision.
steakhal added a comment.
This revision now requires changes to proceed.
In D112621#3160082 <https://reviews.llvm.org/D112621#3160082>, @manas wrote:
> I have made few changes:
>
> 1. The failed assertions <https://reviews.llvm.org/F19816216> due to comparison between different types have been fixed by converting all the Ranges to a given type. This will allow comparisons without throwing errors.
> 2. There was also a build error due to `explicit specialization in non-namespace scope`. This was fixed by @martong previously, but that patch led to the above mentioned bug. So I used @martong 's patch here to make GCC happy.
> 3. I have added a small check for comparison between different types.
>
> https://reviews.llvm.org/D106102 differential contains the background story.
I'm not quite happy.
Next time please make sure that the tests you provide actually exercise the changed code segments.
I deleted all the old lines of the `constant-folding.c` test file and placed a `llvm_unreachable()` into `SymbolicRangeInferrer::VisitBinaryOperator<BO_NE>()` and the test did not cause a crash, which is a clear indication that the test does not test the modified code segments.
Unless I'm overly anxious I would draw false conclusions about the results of the tests and if I approve we could get crashes and complaints, and reverts.
I would kindly ask you to double-check your tests prior to submitting them to review.
---
About the technical content of this patch.
I would recommend following the same pattern as in the rest of the functions. So, `fillGaps()` then `convert()`. That way you would reduce the time-complexity of your code to `O(1)` from `O(N)`.
I would like to ask for a coverage report that shows that all of the branches of the modified code have been exercised by the `constant-folding.c` test file.
That being said, I would like to thank you for your effort in fixing this, I'm really looking forward!
================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1272-1273
+ // (x != y).
+ if ((ConvertedLHS.getMaxValue() < ConvertedRHS.getMinValue()) ||
+ (ConvertedLHS.getMinValue() > ConvertedRHS.getMaxValue())) {
+ return getTrueRange(T);
----------------
This and the subsequent similar block could be implemented by a member function of a `RangeSet`.
It's highly likely that many of these `VisitBinaryOperator<Op>()` functions could benefit from reusing them in the future if we decide to handle more of them.
================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1279-1281
+ if ((ConvertedLHS.getMinValue() == ConvertedRHS.getMaxValue()) &&
+ (ConvertedLHS.getMaxValue() == ConvertedRHS.getMaxValue()) &&
+ (ConvertedLHS.getMinValue() == ConvertedRHS.getMinValue())) {
----------------
`ConvertedLHS.getConcreteValue() && ConvertedLHS.getConcreteValue() == ConvertedRHS.getConcreteValue()`
================
Comment at: clang/test/Analysis/constant-folding.c:326
+ if (s1 >= -1000 && s1 <= -500 && s2 <= -500 && s2 >= -750) {
+ // s1: [-1000,-500], s2: [-500,-750]
+ clang_analyzer_eval((s1 != s2) == 0); // expected-warning{{UNKNOWN}}
----------------
I would assume from `[x, y]` that `x <= y`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112621/new/
https://reviews.llvm.org/D112621
More information about the cfe-commits
mailing list