Szelethus added a comment.

A small nit, otherwise LGTM.

In D143194#4112538 <https://reviews.llvm.org/D143194#4112538>, @balazske wrote:

> Probably it is not always useful to explain why the argument is wrong. In 
> cases when we can find out that the value is exactly between two consecutive 
> valid ranges we can display a note, or when the exact value is known. 
> Otherwise it may end up in something like "the value should be between 1 and 
> 4 or between 6 and 10, but it is less than 1 or exactly 5 or greater than 10".

You're totally right. I'm not sure how to approach tricky cases like that 
either.

> The "good" cases are (when more information is available): "the value is less 
> than 1", "the value is 5", "the value is greater than 10". If two bad ranges 
> are known it may be OK too: "the value is less than 1 or it is exactly 5". 
> The explanation may be possible to implement by test assumes for the negated 
> ranges.

Maybe we can start out with the easier cases, but we should check whether there 
is a checker that solves a different problem, and should try to aim at a 
somewhat general, reusable solution.



================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:95
+                                    QualType ArgT, BasicValueFactory &BVF,
+                                    DescString &Out);
+  /// Append textual description of a numeric range out of [RMin,RMax] to the
----------------
Using a `raw_ostream` as a parameter sounds more elegant than a `SmallString` 
with a precise stack buffer length. Not to mention that you could call this 
function with `llvm::errs()` for easy debugging.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:100
+                                   QualType ArgT, BasicValueFactory &BVF,
+                                   DescString &Out);
 
----------------
Here as well.


================
Comment at: 
clang/test/Analysis/std-c-library-functions-arg-constraints-notes.cpp:51-79
+int __single_val_0(int);      // [0, 0]
 int __single_val_1(int);      // [1, 1]
 int __range_1_2(int);         // [1, 2]
-int __range_1_2__4_5(int);    // [1, 2], [4, 5]
-void test_range(int x) {
-    __single_val_1(2); // \
-    // expected-note{{The 1st argument should be within the range [1, 1]}} \
-    // expected-warning{{}}
-}
-// Do more specific check against the range strings.
+int __range_m1_1(int);         // [-1, 1]
+int __range_m2_m1(int);         // [-2, -1]
+int __range_m10_10(int);         // [-10, 10]
+int __range_m1_inf(int);         // [-1, inf]
----------------
Please clang-format the changes in this test file.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143194/new/

https://reviews.llvm.org/D143194

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to