diff --git a/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp --- a/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp @@ -514,7 +514,7 @@ if (OneOf("snprintf")) return {{1}, {0, ReturnValueIndex}, VariadicType::Src, 3}; if (OneOf("sprintf")) - return {{}, {0, ReturnValueIndex}, VariadicType::Src, 2}; + return {{1}, {0, ReturnValueIndex}, VariadicType::Src, 2}; if (OneOf("strcpy", "stpcpy", "strcat")) return {{1}, {0, ReturnValueIndex}}; if (OneOf("bcopy")) diff --git a/clang/test/Analysis/taint-generic.c b/clang/test/Analysis/taint-generic.c --- a/clang/test/Analysis/taint-generic.c +++ b/clang/test/Analysis/taint-generic.c @@ -341,6 +341,16 @@ *(volatile int *) 0; // no-warning } +int sprintf_is_not_a_source(char *buf, char *msg) { + int x = sprintf(buf, "%s", msg); // no-warning + return 1 / x; // no-warning: 'sprintf' is not a taint source +} + +int sprintf_propagates_taint(char *buf, char *msg) { + scanf("%s", msg); + int x = sprintf(buf, "%s", msg); // propagate taint! + return 1 / x; // expected-warning {{Division by a tainted value, possibly zero}} +} // Test configuration int mySource1();