回答編集履歴
1
fmt
answer
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
-
うーん、これもしかしてバッファーオーバーランじゃないですかね?
|
1
|
+
うーん、これもしかしてバッファーオーバーランじゃないですかね?こうなると問題箇所の絞り込みが人力では困難になってきますというかテクニックがないと無理です。
|
2
2
|
|
3
3
|
std::unique_ptrに書き換えたのにエラーってことは`move`を合法的に書き換えるコードがあったら検出できるはずなので、バッファーオーバーランで意図せず書き換わってるんだと思います。
|
4
4
|
|
5
5
|
[AddressSanitizer (ASan) for Windows with MSVC – C++ Team Blog](https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-windows-with-msvc/)
|
6
|
-
に紹介のあるAddressSanitizer とか[VSに備わっているコード分析ツール](https://docs.microsoft.com/ja-jp/visualstudio/code-quality/quick-start-code-analysis-for-c-cpp?view=vs-2019)を使って自動解析させてみてください。
|
6
|
+
に紹介のあるAddressSanitizer とか[VSに備わっているコード分析ツール](https://docs.microsoft.com/ja-jp/visualstudio/code-quality/quick-start-code-analysis-for-c-cpp?view=vs-2019)を使って自動解析させてみてください。
|
7
|
+
|
8
|
+
これでもだめならDxLibの使ってる関数だけ中身空っぽのモックに差し替えて、Linuxに持っていってvalgrindに掛けるとかしないとだめそう。
|
9
|
+
|
10
|
+
---
|
11
|
+
|
12
|
+
遠回りだけど確実な方法はプログラム中でnewもdeleteもmallocもcallocもfreeも書かないことです。代わりにstd::vectorやstd::string、std::uniuqe_ptrやstd::shared_ptrを使います。
|
13
|
+
|
14
|
+
それから文字列操作をもししているなら、自力でindexアクセスしたりC標準やDxLibの文字列操作系関数を使わないことです。代わりにstd::stringのメンバー関数やargorithmヘッダーの関数群、[fmtlib/fmt](https://github.com/fmtlib/fmt)(sprintf系関数の代替)を使います。
|