だから私を悩ませているこのgcc警告があります:
warning: assuming signed overflow does not occur when simplifying multiplication
それが指すコードは次のようになります。
/* Move the memory block of entries after the removed one - if any. */
if (database->entries + database->entries_size - 1 != database_entry) {
memmove(
database_entry,
database_entry + 1,
sizeof(spm_database_entry_t)
* (
(database->entries + database->entries_size)
- database_entry - 1
)
);
}
簡単に推測できるように、要素の削除後にコンテナのメモリの一部を移動して、さらに再割り当て(縮小)できるようにします。
database_entry
spm_database_entry_t*
削除された要素への型のポインタですdatabase->entries
の配列へのポインタですspm_database_entry_t
database->entries_size
削除前の数値要素をsize_t
表しますdatabase->entries
警告を取り除く方法は?乗算が単純化されるのを防ぐことはできますか、それとも移動する必要のあるメモリの量を計算するためのより良い方法がありますか?
編集
よろしいですdatabase_entry < database->entries + database->entries_size
か?
ポジティブ。
使用しているコンパイラフラグは何ですか?
-Wall -Wextra -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes
-Wmissing-prototypes -Wdeclaration-after-statement -Wwrite-strings
-Winit-self -Wcast-align -Wstrict-aliasing=2 -Wformat=2
-Wmissing-declarations -Wmissing-include-dirs -Wno-unused-parameter
-Wuninitialized -Wold-style-definition -Wno-missing-braces
-Wno-missing-field-initializers -Wswitch-default -Wswitch-enum
-Wbad-function-cast -Wstrict-overflow=5 -Winline -Wundef -Wnested-externs
-Wunreachable-code -Wfloat-equal -Wredundant-decls
-pedantic -ansi
-fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing
edit2
unsigned int
乗算の前にキャストするとうまくいくようですが、そうではありsize_t
ません。私はそれを理解していません-標準size_t
は常に署名されていないと言います...
edit3
コンテキストが役立つ場合:https ://github.com/msiedlarek/libspm/blob/master/libspm/database.c#L116
edit4
stevehaの答えに基づく解決策:
/* Calculate how meny entries need moving after the removal. */
size_t entries_to_move = (
(database->entries + database->entries_size)
- database_entry - 1
);
/* Move the memory block of entries after the removed one - if any. */
memmove(
database_entry,
database_entry + 1,
sizeof(spm_database_entry_t) * entries_to_move
);