Go和C++編譯時的一點小區別------strings命令搞起
阿新 • • 發佈:2019-01-05
最近查一個bug, 用strings命令分析, 竟然出乎意料地沒有結果, 非常納悶。 最後根據這個線索查出了bug的根本原因。
1. 在C++中, 即使函式在程式碼層面沒有被呼叫, 也會最終編譯到二進位制中, 用strings可以分析。
#include <iostream> using namespace std; void fun() { printf("hello world\n"); // strings分析有結果 } int main() { return 0; }
2. 在Go中, 如果函式在程式碼層面沒有被呼叫,或者呼叫時被編譯器優化, 那麼就不會編譯到二進位制中, 用strings就查不到該函式的相關資訊。
package main
import "fmt"
func test (a int){
fmt.Println("testxxxxxx") // strings分析無結果
}
func main() {
}
package main import "fmt" func test (a int){ a = 1 if a != 1{ fmt.Println("testxxxxxx") //strings分析無結果 } } func main() { test(1) }
再看
package main
import "fmt"
func test (a int){
if a != 1{
fmt.Println("testxxxxxx") // strings分析有結果
}
}
func main() {
test(1)
}
有點意思, 揪出一隻大bug.