規範程式設計之變數的初始化
一個程序crash的問題,
ExceptionClass: Native (NE)
Exception Type: SIGSEGV
CurrentExecuting Process:
pid: 386, tid: 399
/system/bin/Tyservice
Backtrace:
#00 pc 0000000000092894 /system/lib64/libc.so (ifree+88)
#01 pc 0000000000092de0 /system/lib64/libc.so (je_free+116)
程式的流程簡化後就是這樣的
#include <stdlib.h>
#include <stdio.h>
int main()
{
chara[3] = {0}, *line;
// char*line;
printf("p = %p \n", line);
free(line);
return 0;
}
對沒有初始化的變數line執行free操作,出現崩潰
編譯後執行
p = 0x55eb14a34610
*** Error in `./test2': munmap_chunk(): invalidpointer: 0x000055eb14a34610 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x790cb)[0x7f05a74170cb]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x1f8)[0x7f05a7424f38]
./test2(+0x785)[0x55eb14a34785]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7f05a73be3f1]
./test2(+0x63a)[0x55eb14a3463a]
但是這樣寫卻不會崩潰
int main()
{
char*line;
printf("p = %p \n", line);
free(line);
return 0;
}
編譯器對第一種寫法沒有作優化。
對於變數的初始化,還是需要規範的去進行初始化。不然在特定情況下會出現莫名其妙的bug。