1// RUN: %check_clang_tidy %s cert-err34-c %t -- -- -std=c11
2
3typedef __SIZE_TYPE__ size_t;
4typedef signed ptrdiff_t;
5typedef long long intmax_t;
6typedef unsigned long long uintmax_t;
7typedef void * FILE;
8
9extern FILE *stdin;
10
11extern int fscanf(FILE * restrict stream, const char * restrict format, ...);
12extern int scanf(const char * restrict format, ...);
13extern int sscanf(const char * restrict s, const char * restrict format, ...);
14
15extern double atof(const char *nptr);
16extern int atoi(const char *nptr);
17extern long int atol(const char *nptr);
18extern long long int atoll(const char *nptr);
19
20void f1(const char *in) {
21 int i;
22 long long ll;
23 unsigned int ui;
24 unsigned long long ull;
25 intmax_t im;
26 uintmax_t uim;
27 float f;
28 double d;
29 long double ld;
30
31 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'sscanf' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtol' instead [cert-err34-c]
32 sscanf(in, "%d", &i);
33 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'fscanf' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtoll' instead [cert-err34-c]
34 fscanf(stdin, "%lld", &ll);
35 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'sscanf' used to convert a string to an unsigned integer value, but function will not report conversion errors; consider using 'strtoul' instead [cert-err34-c]
36 sscanf(in, "%u", &ui);
37 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'fscanf' used to convert a string to an unsigned integer value, but function will not report conversion errors; consider using 'strtoull' instead [cert-err34-c]
38 fscanf(stdin, "%llu", &ull);
39 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtoimax' instead [cert-err34-c]
40 scanf("%jd", &im);
41 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'fscanf' used to convert a string to an unsigned integer value, but function will not report conversion errors; consider using 'strtoumax' instead [cert-err34-c]
42 fscanf(stdin, "%ju", &uim);
43 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'sscanf' used to convert a string to a floating-point value, but function will not report conversion errors; consider using 'strtof' instead [cert-err34-c]
44 sscanf(in, "%f", &f); // to float
45 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'fscanf' used to convert a string to a floating-point value, but function will not report conversion errors; consider using 'strtod' instead [cert-err34-c]
46 fscanf(stdin, "%lg", &d);
47 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'sscanf' used to convert a string to a floating-point value, but function will not report conversion errors; consider using 'strtold' instead [cert-err34-c]
48 sscanf(in, "%Le", &ld);
49
50 // These are conversions with other modifiers
51 short s;
52 char c;
53 size_t st;
54 ptrdiff_t pt;
55
56 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
57 scanf("%hhd", &c);
58 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
59 scanf("%hd", &s);
60 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
61 scanf("%zu", &st);
62 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
63 scanf("%td", &pt);
64 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
65 scanf("%o", ui);
66 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
67 scanf("%X", ui);
68 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
69 scanf("%x", ui);
70}
71
72void f2(const char *in) {
73 // CHECK-MESSAGES: :[[@LINE+1]]:11: warning: 'atoi' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtol' instead [cert-err34-c]
74 int i = atoi(nptr: in); // to int
75 // CHECK-MESSAGES: :[[@LINE+1]]:12: warning: 'atol' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtol' instead [cert-err34-c]
76 long l = atol(nptr: in); // to long
77 // CHECK-MESSAGES: :[[@LINE+1]]:18: warning: 'atoll' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtoll' instead [cert-err34-c]
78 long long ll = atoll(nptr: in); // to long long
79 // CHECK-MESSAGES: :[[@LINE+1]]:14: warning: 'atof' used to convert a string to a floating-point value, but function will not report conversion errors; consider using 'strtod' instead [cert-err34-c]
80 double d = atof(nptr: in); // to double
81}
82
83void f3(void) {
84 int i;
85 unsigned int u;
86 float f;
87 char str[32];
88
89 // Test that we don't report multiple infractions for a single call.
90 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
91 scanf("%d%u%f", &i, &u, &f);
92
93 // Test that we still catch infractions that are not the first specifier.
94 // CHECK-MESSAGES: :[[@LINE+1]]:3: warning: 'scanf' used to convert
95 scanf("%s%d", str, &i);
96}
97
98void do_not_diagnose(void) {
99 char str[32];
100
101 scanf("%s", str); // Not a numerical conversion
102 scanf(restrict: "%*d"); // Assignment suppressed
103}
104

source code of clang-tools-extra/test/clang-tidy/checkers/cert/err34-c.c