2023.10.30
仕事でc言語で作る事がありまして。
別に呼び出される実行ファイルがSegmentation fault で止まる事象がありました。
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main(int argc, char** args){
int i;
char *px;
char *py;
for (i = 0; i < 100;i++){
p = (char*)malloc(sizeof(char) * 100);
}
call_cx(py);
// これも関数内で必ずやってるからと
// 見落としがち。ない領域に実行すると
// どこかのメモリが壊れます。
if (px != NULL) {
free(py);
free(px);
}
return 0;
}
void call_cx(char* value){
char* value2;
Value=(char*)malloc(sizeof(char) * 100);
Value2=(char*)malloc(sizeof(char) * 100);
// 何かしらの処理
//検索結果を返却
// ★value2を解放するはずが。
if(value2 != null) {
free(value);
}
}
freeが2回動いていたことにより、この処理は何も起きないですが、次の別の処理がとまりました。
このケースは、ジョブネットで呼び出しされてました。もし、ジョブネットが各プログラムにメモリを割り当ててから呼び出しているなら、壊れて動く時にエラーが起きます。
また、別のパターンとして、mallocに対するfreeがないため、その分解放されないメモリが生成されたメモリ領域によって次第に圧迫されていきます。サーバー自体がメモリ不足となり遅くなります。
言い訳じみてしまいますが、疲れていて見落としたりします。大体オンラインでピリピリしていて、ヒヤ汗と共に探しているから、冷静さを失っている事が多いので、大体見つけにくいです。
まとめ
細心の注意を払っても起きるため、静的解析やメモリ調査ができるツールの使い方と、トレースができるようになるのは必要だと思います。
株式会社トランソニックソフトウェアについて。弊社は、直取引からシステム屋様の請負業務、業種は幅広くやっております。東京支店と名古屋(本社)があります。
また、のびのびと仕事ができる環境をご用意しております
マイナビからのエントリーも可能です。
プロフィールの採用ページリンクも用意しております。まずは、会社の説明を聞いてみたいというのもありです。web会議などはご相談いただければと思います
問い合わせ先: 052-228-6443
※プロフィールのお問い合わせページからでも可能です。