Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
egtra
PDF, PPTX
4,257 views
Visual C++コード分析を支えるSAL
Boost.勉強会 #21 札幌の発表時のスライドです。Visual C++のコード分析機能で使われるSALの導入的な説明です。
Technology
◦
Read more
2
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 33
2
/ 33
3
/ 33
4
/ 33
5
/ 33
6
/ 33
7
/ 33
8
/ 33
9
/ 33
10
/ 33
Most read
11
/ 33
12
/ 33
13
/ 33
14
/ 33
15
/ 33
16
/ 33
17
/ 33
18
/ 33
19
/ 33
20
/ 33
21
/ 33
22
/ 33
23
/ 33
24
/ 33
25
/ 33
26
/ 33
27
/ 33
28
/ 33
29
/ 33
30
/ 33
31
/ 33
32
/ 33
33
/ 33
More Related Content
PDF
すごい constexpr たのしくレイトレ!
by
Genya Murakami
PDF
Constexpr 中3女子テクニック
by
Genya Murakami
PDF
JVM code reading -- C2
by
ytoshima
PDF
中3女子が狂える本当に気持ちのいい constexpr
by
Genya Murakami
PDF
私を SKI に連れてって
by
Susisu
PPT
Javaバイトコード入門
by
Kota Mizushima
PDF
Vivado hls勉強会3(axi4 lite slave)
by
marsee101
PDF
コルーチンでC++でも楽々ゲーム作成!
by
amusementcreators
すごい constexpr たのしくレイトレ!
by
Genya Murakami
Constexpr 中3女子テクニック
by
Genya Murakami
JVM code reading -- C2
by
ytoshima
中3女子が狂える本当に気持ちのいい constexpr
by
Genya Murakami
私を SKI に連れてって
by
Susisu
Javaバイトコード入門
by
Kota Mizushima
Vivado hls勉強会3(axi4 lite slave)
by
marsee101
コルーチンでC++でも楽々ゲーム作成!
by
amusementcreators
What's hot
PDF
Mavenの真実とウソ
by
Yoshitaka Kawashima
PDF
ELFの動的リンク
by
7shi
PDF
YoctoLTSについて調べてみた
by
wata2ki
PDF
Protocol Buffers 入門
by
Yuichi Ito
PDF
Vivado hls勉強会1(基礎編)
by
marsee101
PDF
C++の話(本当にあった怖い話)
by
Yuki Tamura
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
by
Ryo Sakamoto
PDF
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
by
Genya Murakami
PDF
本当にわかる Spectre と Meltdown
by
Hirotaka Kawata
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
by
Shohei Okada
PPTX
Effective Modern C++ 勉強会 Item 22
by
Keisuke Fukuda
PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
by
Yoshifumi Kawai
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
by
NTT DATA Technology & Innovation
PPTX
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
by
Preferred Networks
PPTX
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
PDF
C#でもメタプログラミングがしたい!!
by
TATSUYA HAYAMIZU
PDF
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
PDF
Go入門
by
Takuya Ueda
PDF
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
by
Preferred Networks
PDF
Intrinsic Methods in HotSpot VM
by
Kris Mok
Mavenの真実とウソ
by
Yoshitaka Kawashima
ELFの動的リンク
by
7shi
YoctoLTSについて調べてみた
by
wata2ki
Protocol Buffers 入門
by
Yuichi Ito
Vivado hls勉強会1(基礎編)
by
marsee101
C++の話(本当にあった怖い話)
by
Yuki Tamura
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
by
Ryo Sakamoto
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
by
Genya Murakami
本当にわかる Spectre と Meltdown
by
Hirotaka Kawata
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
by
Shohei Okada
Effective Modern C++ 勉強会 Item 22
by
Keisuke Fukuda
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
by
Yoshifumi Kawai
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
by
NTT DATA Technology & Innovation
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
by
Preferred Networks
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
C#でもメタプログラミングがしたい!!
by
TATSUYA HAYAMIZU
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
Go入門
by
Takuya Ueda
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
by
Preferred Networks
Intrinsic Methods in HotSpot VM
by
Kris Mok
Viewers also liked
PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
by
Hiro H.
PDF
Visual C++ 2015の紹介(C++11/14的に)
by
egtra
PDF
エクストリームC++11/14プログラミング
by
egtra
PPTX
CppCon2016 report and Boost.SML
by
Takatoshi Kondo
PDF
関数の最小値を求めることから機械学習へ
by
Hiro H.
PDF
C++1z draft
by
Akira Takahashi
PDF
中3女子でもわかる constexpr
by
Genya Murakami
PDF
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
by
hiyohiyo
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
by
Hiro H.
Visual C++ 2015の紹介(C++11/14的に)
by
egtra
エクストリームC++11/14プログラミング
by
egtra
CppCon2016 report and Boost.SML
by
Takatoshi Kondo
関数の最小値を求めることから機械学習へ
by
Hiro H.
C++1z draft
by
Akira Takahashi
中3女子でもわかる constexpr
by
Genya Murakami
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
by
hiyohiyo
Similar to Visual C++コード分析を支えるSAL
PDF
研究生のためのC++ no.2
by
Tomohiro Namba
PPTX
ぱっと見でわかるC++11
by
えぴ 福田
PDF
C++ lecture-1
by
sunaemon
PPTX
ネイティブコードを語る
by
Kenji Imasaki
PDF
C++勉強会
by
mitsutaka_takeda
PDF
Memory sanitizer
by
MITSUNARI Shigeo
PDF
GC in C++0x
by
yak1ex
PPTX
C2C++11Level1
by
Yuki Miyatake
PDF
C/C++プログラマのための開発ツール
by
MITSUNARI Shigeo
PDF
Misrac20150523
by
Kiyoshi Ogawa
PDF
Dalvikバイトコードリファレンスの読み方 改訂版
by
Takuya Matsunaga
PPTX
C++ tips1 #include編
by
道化師 堂華
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
by
和弘 井之上
PPT
プログラミングで言いたい聞きたいこと集
by
tecopark
PPT
プログラミングで言いたいこと聞きたいこと集
by
tecopark
PDF
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
by
Masahiro Sakai
KEY
core dumpでcode golf
by
Nomura Yusuke
PDF
C++ lecture-0
by
sunaemon
PDF
ソフトウェア工学2023 10 デバッグ
by
Toru Tamaki
PDF
C++ マルチスレッド 入門
by
京大 マイコンクラブ
研究生のためのC++ no.2
by
Tomohiro Namba
ぱっと見でわかるC++11
by
えぴ 福田
C++ lecture-1
by
sunaemon
ネイティブコードを語る
by
Kenji Imasaki
C++勉強会
by
mitsutaka_takeda
Memory sanitizer
by
MITSUNARI Shigeo
GC in C++0x
by
yak1ex
C2C++11Level1
by
Yuki Miyatake
C/C++プログラマのための開発ツール
by
MITSUNARI Shigeo
Misrac20150523
by
Kiyoshi Ogawa
Dalvikバイトコードリファレンスの読み方 改訂版
by
Takuya Matsunaga
C++ tips1 #include編
by
道化師 堂華
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
by
和弘 井之上
プログラミングで言いたい聞きたいこと集
by
tecopark
プログラミングで言いたいこと聞きたいこと集
by
tecopark
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
by
Masahiro Sakai
core dumpでcode golf
by
Nomura Yusuke
C++ lecture-0
by
sunaemon
ソフトウェア工学2023 10 デバッグ
by
Toru Tamaki
C++ マルチスレッド 入門
by
京大 マイコンクラブ
More from egtra
PDF
Casablanca
by
egtra
PDF
Firefox拡張機能を始める
by
egtra
PDF
ATLに見る魔術
by
egtra
PDF
再変換 (K2Editor)
by
egtra
PDF
C++11概要 ライブラリ編
by
egtra
PDF
char32_tとXpressiveと
by
egtra
PDF
Boost.Range入門
by
egtra
PPTX
Boost.Graph入門
by
egtra
Casablanca
by
egtra
Firefox拡張機能を始める
by
egtra
ATLに見る魔術
by
egtra
再変換 (K2Editor)
by
egtra
C++11概要 ライブラリ編
by
egtra
char32_tとXpressiveと
by
egtra
Boost.Range入門
by
egtra
Boost.Graph入門
by
egtra
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.
Download