<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 背景 修改PG源碼時,在elog.c文件中準備調用timestamp.c中的`TimestampTz GetCurrentTimestamp(void)`,以獲取當前時間,`TimestampTz`是個int64類型,但是返回值類型不是期望的(是個int32值),但是在另外一個文件postgres.c調用返回的是正常的,如下: ~~~ elog.c: GetCurrentTimestamp() = 3891376011 postgres.c: GetCurrentTimestamp() = 495621643471576 ~~~ 也就是說,同一個函數在不同文件返回值不同! ## 原因調查 首先查看具體函數定義`GetCurrentTimestamp()`,懷疑是elog.c沒有宏定義`HAVE_INT64_TIMESTAMP`,隨后gdb調試查看,最終計算的結果result確實是int64的值,當這個函數返回之后得到的值卻變成了int32的值。 ~~~ TimestampTz GetCurrentTimestamp(void) { TimestampTz result; struct timeval tp; gettimeofday(&tp, NULL); result = (TimestampTz) tp.tv_sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); #ifdef HAVE_INT64_TIMESTAMP result = (result * USECS_PER_SEC) + tp.tv_usec; #else result = result + (tp.tv_usec / 1000000.0); #endif return result; } ~~~ 難道elog.c調用的不是timestamp.c中這個函數?繼續在源碼中查找這個`GetCurrentTimestamp`函數定義,看是否有多個定義。但是查找的結果是除了這個文件有定義,其他文件都沒有這個函數定義,并且在timestamp.c這個函數中添加debug信息也都打印出來了,現在可以確定是函數返回的時候將int64轉成int32了。百思不得其解之際,最后在編譯日志中發現一個warning: ~~~ elog.c:2245: warning: implicit declaration of function ‘GetCurrentTimestamp’ ~~~ 在網上搜了一下,這種警告是由于函數未聲明引起的,但是`GetCurrentTimestamp()`在timestamp.h中聲明了,通過對比postgres.c和elog.c include的頭文件發現區別:postgres.c包含`#include "utils/timestamp.h"`,也就是在postgres.c 中含有`GetCurrentTimestamp`的函數聲明,而在elog.c中卻沒有。在通過測試發現,C程序如果在函數調用前,沒有對函數作聲明,則編譯系統會把第一次遇到的該函數形式(函數定義或函數調用)作為函數的聲明,并將函數類型默認為函數返回值類型! ## 解決方法 在elog.c中添加`#include "utils/timestamp.h"`頭文件,并查看編譯日志看是否有其他這樣的warning。重新配置編譯選項,加上-Werror-implicit-function-declaration,將這種warning改成error,提前報錯。 ## 總結 對于這個warning需要重視,通過修改編譯選項將其變成error,便于我們發現問題,錯誤發現的越早越好,避免在編譯時忽略或者掩蓋錯誤。如果不是這個函數返回值錯誤特別明顯,它將有可能成為一個隱形的bug。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看