亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: hello|world
打印 上一主題 下一主題

[C] 請教: 怎樣判斷一個變量是只讀的(const)? [復(fù)制鏈接]

論壇徽章:
0
31 [報(bào)告]
發(fā)表于 2011-02-16 09:13 |只看該作者
回復(fù) 23# hello|world


    錯誤不是用來屏蔽的。 如果他誤傳了個常量給你,你不報(bào)錯,僅僅是什么都不做,以后出現(xiàn)問題他一定會罵你的。

論壇徽章:
0
32 [報(bào)告]
發(fā)表于 2011-02-16 10:05 |只看該作者
回復(fù)  hello|world


    錯誤不是用來屏蔽的。 如果他誤傳了個常量給你,你不報(bào)錯,僅僅是什么都不做, ...
donotblock 發(fā)表于 2011-02-16 09:13



    接口應(yīng)該明確寫出輸入輸出參數(shù)的類型和范圍,如果你都告訴他要使用char *了,他還非要用const char *,到時(shí)候出了問題,他敢罵你?

論壇徽章:
0
33 [報(bào)告]
發(fā)表于 2011-02-16 10:13 |只看該作者
接口應(yīng)該明確寫出輸入輸出參數(shù)的類型和范圍,如果你都告訴他要使用char *了,他還非要用const ch ...
雨夜流星 發(fā)表于 2011-02-16 10:05



    我是說該讓他出錯或崩潰而不讓他出錯會被罵。。。你完全理解反了我的意思

論壇徽章:
0
34 [報(bào)告]
發(fā)表于 2011-02-17 10:17 |只看該作者
可能樓主需要的是這個
IsBadWritePtr

論壇徽章:
0
35 [報(bào)告]
發(fā)表于 2011-02-17 10:52 |只看該作者
用objdump看這個變量符號的存在位置,如果在.rodata則是只讀的。
davelv 發(fā)表于 2011-02-15 10:38



    看生成可執(zhí)行文件中這個變量在什么區(qū) 如果是RO區(qū) 說明是只讀的 推薦看一下ELF文件格式

論壇徽章:
0
36 [報(bào)告]
發(fā)表于 2011-02-17 10:56 |只看該作者
實(shí)在想知道的話 就比較地址范圍吧

在鏈接文件中存有RO區(qū)地址的范圍, 在程序中比較即可


if(&var > 0x08004000 && &var < 0x08006000)

論壇徽章:
1
技術(shù)圖書徽章
日期:2014-03-06 15:32:30
37 [報(bào)告]
發(fā)表于 2011-02-17 11:30 |只看該作者
需求是合理的嗎?
設(shè)計(jì)是合理的嗎?
是哪里出的錯誤?
哪里出的錯誤就在哪里解決。

論壇徽章:
0
38 [報(bào)告]
發(fā)表于 2011-02-17 15:33 |只看該作者
本帖最后由 hello|world 于 2011-02-17 15:45 編輯

回復(fù) 34# rong_bo

必須感謝下這個回復(fù),不管以后是否能用上,確實(shí)也是一種辦法~
  1. #include   <setjmp.h>
  2. #include   <signal.h>
  3. #include   <stdlib.h>
  4. #include   <stdio.h>

  5. /*
  6.   ***************************
  7.   *   Global   Variables   
  8.   ***************************
  9. */
  10. static   volatile   sig_atomic_t   segv_flag;
  11. static   jmp_buf   jmp_env;

  12. /*
  13.   ********************************************
  14.   *   Pre:   none   
  15.   *   Post:   restore   the   original   process   state   
  16.   *       and   return   1   to   setjmp
  17.   ********************************************
  18. */
  19. static   void   segv_handler(   int   dummy   )
  20. {
  21. segv_flag   =   1;
  22. longjmp(   jmp_env   ,   1);
  23. }

  24. /*
  25.   ********************************************
  26.   *   Pre:   A   pointer   and   it 's   length
  27.   *   Post:   Return   true   is   the   pointer   is   bad
  28.   *       or   false   if   otherwise
  29.   ********************************************
  30. */

  31. int   IsReadBadPtr(void   *   ptr_buffer,   unsigned   long   buffer_size)
  32. {
  33. struct   sigaction   oldaction,   newaction;
  34. volatile   char   dummy;
  35. char   *ptr   =   (char   *)ptr_buffer;

  36. if   (   !buffer_size   )
  37. return   0;

  38.             /*   storing   the   old   signal   environment   and   trapping   SIGSEGV   */
  39. newaction.sa_handler   =   segv_handler;
  40. newaction.sa_flags   =   0;
  41. sigemptyset(   &newaction.sa_mask);

  42. sigaction(   SIGSEGV,   &newaction,   &oldaction);

  43. segv_flag   =   0;

  44.             /*   Storing   the   process   state   so   if   any   failure   happens   
  45.                   we   can   restore   it   to   the   original   state   */
  46. if   (   setjmp(jmp_env)   ==   0   )
  47. {
  48. /*   testing   the   pointer:   only   the   first   and   the   end   are         needed   here   since   any   failure   to   any   of   this   would           indicate   there   would   an   error   on   the   entire   range   */
  49. dummy   =   ptr[0];
  50. dummy   =   ptr[buffer_size-1];
  51. }

  52.             /*   restoring   the   original   signal   environment   */
  53. sigaction(SIGSEGV,   &oldaction,   NULL);

  54. return   segv_flag;
  55. }

  56. int   main()
  57. {
  58. char   *testptr,c;     //   testptr[10],結(jié)果將是Ok   read   Ptr

  59. if   (   IsReadBadPtr(testptr,   10))
  60. printf( "   Bad   read   Ptr\n ");
  61. else
  62. printf( "   Ok   read   Ptr\n ");
  63. fflush(stdout);
  64. return   0;
  65. }
復(fù)制代碼

論壇徽章:
0
39 [報(bào)告]
發(fā)表于 2011-02-17 16:04 |只看該作者
這個比較簡單,可以通過檢查該變量地址是否有可寫屬性
通過分析/proc/pid/maps文件可以得出

下面是實(shí)現(xiàn):
  1. int check_mem_wrtieable(unsigned long addr, int len)
  2. {
  3.         pid_t pid ;
  4.         char namemaps[64];
  5.         unsigned long ulStartAddr, ulEndAddr, ulLastAddr;
  6.         char access , buff[1024];
  7.         FILE *pmap;
  8.        
  9.         pid = getpid();
  10.         sprintf(namemaps, "/proc/%d/maps", pid);
  11.        
  12.         pmap = fopen(namemaps, "rb");
  13.         if(pmap)
  14.         {
  15.                 while(1)
  16.                 {
  17.                         if(NULL == fgets(buff, sizeof(buff)-1, pmap))
  18.                         {
  19.                                 if(feof(pmap)) break;
  20.                                 else
  21.                                 {
  22.                                         fclose(pmap);
  23.                                         return 0;
  24.                                 }
  25.                         }
  26.                        
  27.                         sscanf(buff, "%x-%x %*c%c", &ulStartAddr, &ulEndAddr, &access);
  28.                        
  29.                         if(addr <= ulEndAddr && addr >= ulStartAddr)
  30.                         {
  31.                                 if('w' != access)
  32.                                 {
  33.                                         fclose(pmap);
  34.                                         return 0;
  35.                                 }
  36.                                
  37.                                 if((addr + len) < ulEndAddr)
  38.                                 {
  39.                                         fclose(pmap);
  40.                                         return 1;
  41.                                 }
  42.                                 else // 檢查后面部分地址
  43.                                 {
  44.                                         ulLastAddr = ulEndAddr;
  45.                                         len = len - (ulEndAddr - addr);
  46.                                         addr = ulLastAddr;
  47.                                 }
  48.                         }
  49.                         printf("%#x %#x %c\n", ulStartAddr, ulEndAddr, access);       
  50.                 }
  51.         }
  52.        
  53.         fclose(pmap);
  54.         return 0;
  55. }
復(fù)制代碼

論壇徽章:
0
40 [報(bào)告]
發(fā)表于 2011-02-18 09:45 |只看該作者
感覺樓主想錯了方向, 這種情況下,程序COREDUMP是最好的。不然,如果指針本身不合法(例如,指向了剛剛釋放了的內(nèi)存),這些判斷也白搭。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP