回答編集履歴

7

衍字修正

2020/08/05 08:40

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -58,8 +58,6 @@
58
58
 
59
59
  warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
60
60
 
61
- 1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
62
-
63
61
  ```
64
62
 
65
63
 

6

コード分析結果例更新

2020/08/05 08:40

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  out_func("out sentence1 = %s", 1);
42
42
 
43
- out_func("out sentence1 = %s %s", "one");
43
+ out_func("out sentence1 = %s");
44
44
 
45
45
  out_func("out sentence2 = %s", "one", "two");
46
46
 
@@ -54,7 +54,7 @@
54
54
 
55
55
  warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
56
56
 
57
- warning C6063: 'out_func' (変換指定子 '2' に対応する) への文字列引数がありません。
57
+ warning C6063: 'out_func' (変換指定子 '1' に対応する) への文字列引数がありません。
58
58
 
59
59
  warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
60
60
 

5

コード分析結果例追記

2020/08/05 08:39

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -40,6 +40,10 @@
40
40
 
41
41
  out_func("out sentence1 = %s", 1);
42
42
 
43
+ out_func("out sentence1 = %s %s", "one");
44
+
45
+ out_func("out sentence2 = %s", "one", "two");
46
+
43
47
  ```
44
48
 
45
49
  に対するコード分析結果
@@ -49,6 +53,12 @@
49
53
  warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
50
54
 
51
55
  warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
56
+
57
+ warning C6063: 'out_func' (変換指定子 '2' に対応する) への文字列引数がありません。
58
+
59
+ warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
60
+
61
+ 1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
52
62
 
53
63
  ```
54
64
 

4

コード分析例追記

2020/08/05 08:38

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -38,6 +38,8 @@
38
38
 
39
39
  out_func("out sentence1 = %d", "one");
40
40
 
41
+ out_func("out sentence1 = %s", 1);
42
+
41
43
  ```
42
44
 
43
45
  に対するコード分析結果
@@ -45,6 +47,8 @@
45
47
  ```
46
48
 
47
49
  warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
50
+
51
+ warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
48
52
 
49
53
  ```
50
54
 

3

コード分析結果追記

2020/08/05 08:33

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -32,9 +32,29 @@
32
32
 
33
33
 
34
34
 
35
+ 書式誤りの
36
+
37
+ ```
38
+
39
+ out_func("out sentence1 = %d", "one");
40
+
41
+ ```
42
+
43
+ に対するコード分析結果
44
+
45
+ ```
46
+
47
+ warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
48
+
49
+ ```
50
+
51
+
52
+
35
53
  ---
36
54
 
37
55
  可変引数テンプレート版
56
+
57
+ 可変引数テンプレートの場合は`_Printf_format_string_`をつけてもチェックしてくれないようです…
38
58
 
39
59
  ```C++
40
60
 
@@ -42,7 +62,7 @@
42
62
 
43
63
  template <class...Args>
44
64
 
45
- void out_func(_Printf_format_string_ const char* format, Args...args) {
65
+ void out_func(const char* format, Args...args) {
46
66
 
47
67
  int len = _scprintf(format, args...) + 1;
48
68
 

2

コード追記

2020/08/05 08:29

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -29,3 +29,29 @@
29
29
  }
30
30
 
31
31
  ```
32
+
33
+
34
+
35
+ ---
36
+
37
+ 可変引数テンプレート版
38
+
39
+ ```C++
40
+
41
+ #include <vector>
42
+
43
+ template <class...Args>
44
+
45
+ void out_func(_Printf_format_string_ const char* format, Args...args) {
46
+
47
+ int len = _scprintf(format, args...) + 1;
48
+
49
+ std::vector<char> buffer(len * sizeof(char));
50
+
51
+ sprintf_s(&buffer[0], len, format, args...);
52
+
53
+ std::cout << &buffer[0] << std::endl;
54
+
55
+ }
56
+
57
+ ```

1

コード修正

2020/08/05 08:06

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -22,9 +22,9 @@
22
22
 
23
23
  vsprintf_s(&buffer[0], len, format, args);
24
24
 
25
+ va_end(args);
26
+
25
27
  std::cout << &buffer[0] << std::endl;
26
-
27
- va_end(args);
28
28
 
29
29
  }
30
30