回答編集履歴
7
衍字修正
answer
CHANGED
@@ -28,7 +28,6 @@
|
|
28
28
|
warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
|
29
29
|
warning C6063: 'out_func' (変換指定子 '1' に対応する) への文字列引数がありません。
|
30
30
|
warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
|
31
|
-
1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
|
32
31
|
```
|
33
32
|
|
34
33
|
---
|
6
コード分析結果例更新
answer
CHANGED
@@ -19,14 +19,14 @@
|
|
19
19
|
```
|
20
20
|
out_func("out sentence1 = %d", "one");
|
21
21
|
out_func("out sentence1 = %s", 1);
|
22
|
-
out_func("out sentence1 = %s
|
22
|
+
out_func("out sentence1 = %s");
|
23
23
|
out_func("out sentence2 = %s", "one", "two");
|
24
24
|
```
|
25
25
|
に対するコード分析結果
|
26
26
|
```
|
27
27
|
warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
|
28
28
|
warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
|
29
|
-
warning C6063: 'out_func' (変換指定子 '
|
29
|
+
warning C6063: 'out_func' (変換指定子 '1' に対応する) への文字列引数がありません。
|
30
30
|
warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
|
31
31
|
1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
|
32
32
|
```
|
5
コード分析結果例追記
answer
CHANGED
@@ -19,11 +19,16 @@
|
|
19
19
|
```
|
20
20
|
out_func("out sentence1 = %d", "one");
|
21
21
|
out_func("out sentence1 = %s", 1);
|
22
|
+
out_func("out sentence1 = %s %s", "one");
|
23
|
+
out_func("out sentence2 = %s", "one", "two");
|
22
24
|
```
|
23
25
|
に対するコード分析結果
|
24
26
|
```
|
25
27
|
warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
|
26
28
|
warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
|
29
|
+
warning C6063: 'out_func' (変換指定子 '2' に対応する) への文字列引数がありません。
|
30
|
+
warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
|
31
|
+
1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
|
27
32
|
```
|
28
33
|
|
29
34
|
---
|
4
コード分析例追記
answer
CHANGED
@@ -18,10 +18,12 @@
|
|
18
18
|
書式誤りの
|
19
19
|
```
|
20
20
|
out_func("out sentence1 = %d", "one");
|
21
|
+
out_func("out sentence1 = %s", 1);
|
21
22
|
```
|
22
23
|
に対するコード分析結果
|
23
24
|
```
|
24
25
|
warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
|
26
|
+
warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
|
25
27
|
```
|
26
28
|
|
27
29
|
---
|
3
コード分析結果追記
answer
CHANGED
@@ -15,12 +15,22 @@
|
|
15
15
|
}
|
16
16
|
```
|
17
17
|
|
18
|
+
書式誤りの
|
19
|
+
```
|
20
|
+
out_func("out sentence1 = %d", "one");
|
21
|
+
```
|
22
|
+
に対するコード分析結果
|
23
|
+
```
|
24
|
+
warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
|
25
|
+
```
|
26
|
+
|
18
27
|
---
|
19
28
|
可変引数テンプレート版
|
29
|
+
可変引数テンプレートの場合は`_Printf_format_string_`をつけてもチェックしてくれないようです…
|
20
30
|
```C++
|
21
31
|
#include <vector>
|
22
32
|
template <class...Args>
|
23
|
-
void out_func(
|
33
|
+
void out_func(const char* format, Args...args) {
|
24
34
|
int len = _scprintf(format, args...) + 1;
|
25
35
|
std::vector<char> buffer(len * sizeof(char));
|
26
36
|
sprintf_s(&buffer[0], len, format, args...);
|
2
コード追記
answer
CHANGED
@@ -13,4 +13,17 @@
|
|
13
13
|
va_end(args);
|
14
14
|
std::cout << &buffer[0] << std::endl;
|
15
15
|
}
|
16
|
+
```
|
17
|
+
|
18
|
+
---
|
19
|
+
可変引数テンプレート版
|
20
|
+
```C++
|
21
|
+
#include <vector>
|
22
|
+
template <class...Args>
|
23
|
+
void out_func(_Printf_format_string_ const char* format, Args...args) {
|
24
|
+
int len = _scprintf(format, args...) + 1;
|
25
|
+
std::vector<char> buffer(len * sizeof(char));
|
26
|
+
sprintf_s(&buffer[0], len, format, args...);
|
27
|
+
std::cout << &buffer[0] << std::endl;
|
28
|
+
}
|
16
29
|
```
|
1
コード修正
answer
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
int len = _vscprintf(format, args) + 1;
|
11
11
|
std::vector<char> buffer(len * sizeof(char));
|
12
12
|
vsprintf_s(&buffer[0], len, format, args);
|
13
|
+
va_end(args);
|
13
14
|
std::cout << &buffer[0] << std::endl;
|
14
|
-
va_end(args);
|
15
15
|
}
|
16
16
|
```
|