aaron.ballman added inline comments.

================
Comment at: 
clang-tools-extra/clang-tidy/bugprone/PercentNFormatSpecifierCheck.cpp:26-27
+  bool HandlePrintfSpecifier(const analyze_printf::PrintfSpecifier &FS,
+                             const char *startSpecifier,
+                             unsigned specifierLen) override {
+    const analyze_printf::PrintfConversionSpecifier &CS =
----------------



================
Comment at: 
clang-tools-extra/clang-tidy/bugprone/PercentNFormatSpecifierCheck.cpp:43-57
+  auto PrintfDecl = functionDecl(hasName("::printf"));
+  auto FprintfDecl = functionDecl(hasName("::fprintf"));
+  auto VfprintfDecl = functionDecl(hasName("::vfprintf"));
+  auto SprintfDecl = functionDecl(hasName("::sprintf"));
+  auto SnprintfDecl = functionDecl(hasName("::snprintf"));
+  auto VprintfDecl = functionDecl(hasName("::vprintf"));
+  auto VsprintfDecl = functionDecl(hasName("::vsprintf"));
----------------
Rather than separate all these into individual matchers, I think it's better to 
use `hasAnyName()`. e.g.,
```
  Finder->addMatcher(
      callExpr(callee(functionDecl(
                   hasAnyName("::printf", "::vprintf", "::scanf", "::vscanf"))),
               hasArgument(0, stringLiteral().bind("StringLiteral"))),
      this);
```
Also, it looks like this misses the `wchar_t` variants.

One additional design question is whether we should consider user-specified 
functions which use the `format` attribute in general. Using that attribute 
implies the function handles format specifier strings, so it seems like those 
functions would also want to flag %n for this particular check.


================
Comment at: 
clang-tools-extra/clang-tidy/bugprone/PercentNFormatSpecifierCheck.cpp:89
+        Result.Context->getTargetInfo());
+    diag(loc, "usage of %%n can lead to unsafe writing to memory");
+  }
----------------
FWIW, this diagnostic sounds more scary than I think it should. This implies to 
me that tidy has found an unsafe usage when in fact, tidy is only identifying 
that you have used the feature at all.

Personally, I think it's more useful to limit the check to problematic 
situations. Use of `%n` by itself is not unsafe (in fact, I cannot think of a 
situation where use of `%n` in a *string literal* format specifier is ever a 
problem by itself. Generally, the safety concerns come from having a *non 
string literal* format specifier where an attacker can insert their own `%n`.

If you want this check to be "did you use `%n` at all", then I think the 
diagnostic should read more along the lines of `'%n' used as a format 
specifier` instead. However, I question whether "bugprone" is the right place 
for it at that point, because it's not really pointing out buggy code.


================
Comment at: 
clang-tools-extra/docs/clang-tidy/checks/bugprone-percent-n-format-specifier.rst:7-8
+Finds any usage of the %n format specifier inside the format string
+of a call to printf, scanf, or any of their derivatives. The %n format
+specifier can lead to unsafe writing to memory.
+
----------------
Similar concerns about overselling the safety aspect of using `%n`.


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

https://reviews.llvm.org/D110436

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

Reply via email to