Enviar pesquisa
Carregar
Visual C++コード分析を支えるSAL
•
2 gostaram
•
4,186 visualizações
egtra
Seguir
Boost.勉強会 #21 札幌の発表時のスライドです。Visual C++のコード分析機能で使われるSALの導入的な説明です。
Leia menos
Leia mais
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 33
Baixar agora
Baixar para ler offline
Recomendados
C++の黒魔術
C++の黒魔術
Daichi OBINATA
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
貴志 上坂
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
Shintarou Okada
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
エラーハンドリング
エラーハンドリング
道化師 堂華
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
Recomendados
C++の黒魔術
C++の黒魔術
Daichi OBINATA
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
貴志 上坂
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
Shintarou Okada
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
エラーハンドリング
エラーハンドリング
道化師 堂華
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
Go入門
Go入門
Takuya Ueda
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 Linux
Tomoki SHISHIKURA
SDL2の紹介
SDL2の紹介
nyaocat
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
Unity Technologies Japan K.K.
Javaバイトコード入門
Javaバイトコード入門
Kota Mizushima
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
GPU最適化入門
GPU最適化入門
Takahiro KOGUCHI
ゲーム開発とデザインパターン
ゲーム開発とデザインパターン
Takashi Komada
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証
レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証
Recruit Technologies
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
Yoshifumi Kawai
PWNの超入門 大和セキュリティ神戸 2018-03-25
PWNの超入門 大和セキュリティ神戸 2018-03-25
Isaac Mathis
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Go初心者がGoでコマンドラインツールの作成に挑戦した話
dcubeio
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
最強オブジェクト指向言語 JavaScript 再入門!
最強オブジェクト指向言語 JavaScript 再入門!
Yuji Nojima
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)
egtra
Mais conteúdo relacionado
Mais procurados
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
Go入門
Go入門
Takuya Ueda
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 Linux
Tomoki SHISHIKURA
SDL2の紹介
SDL2の紹介
nyaocat
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
Unity Technologies Japan K.K.
Javaバイトコード入門
Javaバイトコード入門
Kota Mizushima
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
GPU最適化入門
GPU最適化入門
Takahiro KOGUCHI
ゲーム開発とデザインパターン
ゲーム開発とデザインパターン
Takashi Komada
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証
レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証
Recruit Technologies
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
Yoshifumi Kawai
PWNの超入門 大和セキュリティ神戸 2018-03-25
PWNの超入門 大和セキュリティ神戸 2018-03-25
Isaac Mathis
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Go初心者がGoでコマンドラインツールの作成に挑戦した話
dcubeio
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
最強オブジェクト指向言語 JavaScript 再入門!
最強オブジェクト指向言語 JavaScript 再入門!
Yuji Nojima
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
Mais procurados
(20)
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Go入門
Go入門
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 Linux
SDL2の紹介
SDL2の紹介
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
Javaバイトコード入門
Javaバイトコード入門
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
GPU最適化入門
GPU最適化入門
ゲーム開発とデザインパターン
ゲーム開発とデザインパターン
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証
レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
PWNの超入門 大和セキュリティ神戸 2018-03-25
PWNの超入門 大和セキュリティ神戸 2018-03-25
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Go初心者がGoでコマンドラインツールの作成に挑戦した話
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
最強オブジェクト指向言語 JavaScript 再入門!
最強オブジェクト指向言語 JavaScript 再入門!
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
Destaque
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)
egtra
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミング
egtra
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SML
Takatoshi Kondo
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ
Hiro H.
C++1z draft
C++1z draft
Akira Takahashi
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
hiyohiyo
Destaque
(8)
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミング
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SML
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ
C++1z draft
C++1z draft
中3女子でもわかる constexpr
中3女子でもわかる constexpr
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
Semelhante a Visual C++コード分析を支えるSAL
Objc lambda
Objc lambda
matuura_core
N3495 inplace realloc
N3495 inplace realloc
Takatoshi Kondo
C++0x総復習
C++0x総復習
道化師 堂華
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
Misrac20150523
Misrac20150523
Kiyoshi Ogawa
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
Masanori Masui
知って得するC#
知って得するC#
Shota Baba
C++ lecture-0
C++ lecture-0
sunaemon
Emcpp item31
Emcpp item31
mitsutaka_takeda
4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
mao999
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
信之 岩永
Altanative macro
Altanative macro
Motohiro KOSAKI
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
C#勉強会
C#勉強会
hakugakucafe
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
信之 岩永
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
Semelhante a Visual C++コード分析を支えるSAL
(20)
Objc lambda
Objc lambda
N3495 inplace realloc
N3495 inplace realloc
C++0x総復習
C++0x総復習
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
Misrac20150523
Misrac20150523
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
知って得するC#
知って得するC#
C++ lecture-0
C++ lecture-0
Emcpp item31
Emcpp item31
4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
Altanative macro
Altanative macro
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
C#勉強会
C#勉強会
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
Mais de egtra
Casablanca
Casablanca
egtra
Firefox拡張機能を始める
Firefox拡張機能を始める
egtra
ATLに見る魔術
ATLに見る魔術
egtra
再変換 (K2Editor)
再変換 (K2Editor)
egtra
C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
char32_tとXpressiveと
char32_tとXpressiveと
egtra
Boost.Range入門
Boost.Range入門
egtra
Boost.Graph入門
Boost.Graph入門
egtra
Mais de egtra
(8)
Casablanca
Casablanca
Firefox拡張機能を始める
Firefox拡張機能を始める
ATLに見る魔術
ATLに見る魔術
再変換 (K2Editor)
再変換 (K2Editor)
C++11概要 ライブラリ編
C++11概要 ライブラリ編
char32_tとXpressiveと
char32_tとXpressiveと
Boost.Range入門
Boost.Range入門
Boost.Graph入門
Boost.Graph入門
Visual C++コード分析を支えるSAL
1.
Visual C++コード分析を 支えるSAL H.28/11/05 Egtra Boost.勉強会 #21
2.
自分 • Egtra – Twitter:
@egtra – http://dev.activebasic.com/egtra/ • 仕事: 主にVisual C++ 2005/2015 (Windows) – 最近はそれ以外も
3.
cl.exe /analyze • Visual
C++には 静的コード解析の機能がある。 – Visual C++ 2005から • コンパイラオプション/analyze
4.
SAL • ソースコードに注釈を付ける専用言語。 • /analyzeに対する情報提供。 •
例: void f(_In_ int x); https://msdn.microsoft.com/ja-jp/library/hh916383.aspx
5.
使用箇所 • 以下で使われている。 – VC++の標準Cライブラリのヘッダー –
Windows SDKのヘッダー • 自分のコードにも、SAL注釈を付ければ、 さらに効果が得られる。 – でもちょっと大変かも。
6.
例 int main() { int
x; x += 100; }
7.
例 int main() { int
x; x += 100; } warning C6001: 初期化されていないメモ リ 'x' を使用しています。
8.
目次 • 読むか書くか • nullptrの可否 •
要素数
9.
読むか書くか 仮引数の入出力の方向
10.
関数をまたいで検知したい • このコードは警告出てほしい。 void f1(int*
p) { *p += 100; // 読んで書く } int main() { int x; f1(&x); // 未初期化を渡している! }
11.
関数をまたいで検知したい • 一方、このコードは警告出なくていい。 void f2(int*
p) { *p = 100; // 代入! } int main() { int x; f1(&x); // 未初期化の変数だけどOK }
12.
アノテーション(注釈) • 仮引数に追加情報。 void f1(_Inout_
int* p) { *p += 100; } int main() { int x; f1(&x); } ← warning C6001: 初期化 されていないメモリ 'x' を 使用しています。
13.
アノテーション(注釈) • 元の値を読まないことの指定。 void f2(_Out_
int* p) { *p = 100; // 代入! } int main() { int x; f1(&x); }
14.
データの入出力方向 • _Inout_と_Out_があるなら、 もちろん_In_もある。 void f3(_In_
const int* p) { std::cout << *p << std::endl; } int main() { int x; f3(&x); } // warning C6001 初期化されていないメモリ 'x' ……
15.
ここまでのまとめ 呼び出し元で 呼び出し先(関数内)で _In_ 入力
要初期化 読み取りのみ _Inout_ 入出力 要初期化 読み書きする _Out_ 出力 初期化不要 書き込み(※) • 3つともポインタ・参照に適用可 • _In_のみ、値渡しに適用可能 – 例: void f(_In_ int x);
16.
_Out_の意味 ※ _Out_は書き込み限定ではない 元の値を読み取らないだけ void my_rand(_Out_
int* p) { do { *p = rand(); } while (*p >= 10000); // OK }
17.
ダメな例 前ページのコード、最初こう書いた。 void my_rand(_Out_ int*
p) { while (*p >= 10000) { // C6001 *p = rand(); } }
18.
nullptrの可否
19.
nullptrを渡して良いかの指定 • nullptrを渡しても良いならopt nullptr不許可 nullptr許可 _In_
_In_opt_ _Inout_ _Inout_opt_ _Out_ _Out_opt_
20.
呼び出す側の例 void f1(_In_ void*
p); void f2(_In_opt_ void* p); int main() { f1(malloc(1)); // 警告 f2(malloc(1)); // OK } warning C6387: '_Param_(1)' は '0' である可能性があります: この 動作は、関数 'f1' の指定に従っていません。
21.
注意その1 • あくまでコンパイル時警告の情報提供 • f2はこうでもいい void
f2(_In_opt_ void* p) { if (p == nullptr) { std::terminate(); } }
22.
注意その2 • あくまでコンパイル時警告の情報提供 • _In_/_Inout_/_Out_仮引数でnullptr チェックしてもいい void
f1(_In_ void* p) { if (p == nullptr) { ……
23.
呼び出される側の例 (1) • _In_/_Inout_/_Out_ならnullptr チェックせず読み書きして良い void
print1(_In_ int* p) { std::cout << *p << std::endl; } (警告出ない)
24.
呼び出される側の例 (2) • _In_opt_/_Inout_opt_/_Out_opt_は nullptrかもしれないと想定される。 void
print2(_In_opt_ int* p) { std::cout << *p << std::endl; } warning C6011: NULL ポインター 'p' を逆参照 しています。
25.
要素数 配列とヌル終端文字列
26.
配列の注釈 • もちろんoptバージョンもある – 例:
_In_reads_opt_(n) _In_reads_(n) 入力 _Inout_updates_(n) 入出力 _Out_writes_(n) 出力 • 配列へのポインタの仮引数では、 要素数を指定する。
27.
例 その1 UINT WINAPI
SendInput( _In_ UINT cInputs, _In_reads_(cInputs) LPINPUT pInputs, _In_ int cbSize); 仮引数pInputsは、 要素数cInputs個の配列を指すポインタ。
28.
例 その2 int WINAPI
GetWindowTextW( _In_ HWND hwnd, _Out_writes_(nMaxCount) LPWSTR lpString, _In_ int nMaxCount); 仮引数lpStringは、 最大で要素数nMaxCount個書き込まれる。
29.
文字列 その1 <stdio.h>より int __cdecl
fputs( _In_z_ char const* _Buffer, _Inout_ FILE* _Stream );
30.
文字列 その2 BOOL WINAPI
DeleteFileA( _In_ LPCSTR lpFileName); • lpFileNameはヌル終端文字列扱い。 • LPCSTRなど一部の型は、 typedefに注釈が付与されている。
31.
終わりに
32.
終わりに • ここまでの例では こういうのを検知できる(かも)。 – 未初期化変数からの読み取り –
nullptrへのアクセス – 配列の要素数を超えたアクセス • 注意: /analyzeの機能はまだあるよ。
33.
This work is
licensed under a Creative Commons Attribution- ShareAlike 4.0 International License.
Baixar agora