如果連到這篇 blog 的原因,是 visucal c++ 裡面出現
error LNK2019:無法解析的外部符號 _WinMain@16 在函式 ___tmainCRTStartup 中被參考
代表專案選錯了,再去上網查正確的專案選項為何。
這裡講的「找不到 main」,是 coder 故意弄得他人找不到函式入口在哪裡,
但實際上它是存在的,妙的是有些方式在 VC IDE 或 VAX 下也找不到 main,
特別是程式碼一大、眼一花,真的不好找出 main 在哪。
有時此技巧也被拿來對付一些要作業的有心人,炫技成份居多。
故意讓人找不到 main 不是個好習慣,最常用來被使用,就是不希望別人能一眼看穿程式碼在寫什麼,
不知為何,明明執行效率一樣,增加了 pre-process 負擔,但有人就覺得比較強,
關鍵處點破便不值錢,簡易程式碼範例如下,可得到一些蛛絲馬跡,
再經過 search 後應可豁然開朗。
#include <stdio.h> #define edison(a,b) a##ai##b##() #define edisonx(a,b) edison(a,b) int edisonx(a,c); int edisonx(b,d); int edisonx(m,n); int last_func(); int edisonx(a,c) { printf("from edisonx ac\n"); edisonx(b,d); return 0; } int edisonx(m,n) { printf("from edisonx mn"); edisonx(a,c); return 0; } int edisonx(b,d) { printf("from edisonx bd\n"); last_func(); return 0; } int last_func() { printf("from last func\n"); return 0; }
複雜可以寫到很複雜,連 int main(int argc, char **argv)
這種都可以藏起來。
試試看,在 Outline 裡面應該只看得到 edisonx( x,x) 及 last_func 之函式,
這點在 VC 、VAX、PSPad 試都一樣 ,
相信其他的 IDE 也都一樣,主要是判別規則問題,且相信任何 IDE 均如此。
真正讓人找不到函式入口點的,應是 MFC 裡面之 WinApp,
因其被隱含建構時喚起。也鑑於 C++ 這種特性,於是又有這種 code 出現
#include <stdio.h> #include <stdlib.h> #define edison(a,b) a##ai##b##() #define edisonx(a,b) edison(a,b) int edisonx(a,c); int edisonx(b,d); int edisonx(m,n); int edisonx(a,c) { printf("hello, world!!"); exit(1); return 0; } int edisonx(m,n) { printf("hello, world!!"); exit(1); return 0; } int edisonx(b,d) { printf("hello, world!!"); exit(1); return 0; } int v1 = edisonx(a,c); int v2 = edisonx(m,n); int v3 = edisonx(b,d);
這還只是放在單一檔案而已,若是拆多個檔案編譯,
放這種地雷即使用 vc 單步 trace 也找不到入口點。
幸運的話,將每個 function 都設斷點還有機會可以找到入口點在哪,
簡而言之,是貍貓換太子,即使找到 main 修改程式碼,也是假的。
留言列表