Index: clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp +++ 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")) Index: clang/test/Analysis/taint-generic.c =================================================================== --- clang/test/Analysis/taint-generic.c +++ clang/test/Analysis/taint-generic.c @@ -341,6 +341,17 @@ *(volatile int *) 0; // no-warning } +int sprintf_is_not_a_source(char *buf) { + int x = sprintf(buf, "Covid-%d", 19); // no-warning + return 1 / x; // no-warning: 'sprintf' is not a taint source +} + +int sprintf_propagates_taint(char *buf) { + int year; + scanf("%d", &year); + int x = sprintf(buf, "Covid-%d", year); // propagate taint! + return 1 / x; // expected-warning {{Division by a tainted value, possibly zero}} +} // Test configuration int mySource1();