2017-06-23 94 views
0

此轉換是從jint *(32位有符號)到uint32_t *有效嗎?它有效,但它似乎是一個黑客。編程語言是C提前將JNI簽名指針指向無符號本地指針(C)

JNIEXPORT jint JNICALL Java_foo_bar(JNIENV *env, jobject thisObj, jintArray inputDataJava){ 

/* Input data is signed */ 
jint * inputDataSigned = (*env)->GetIntArrayElements(env,inputDataJava,0); 

/* Input data has been casted to unsigned. Is that valid? */ 
uint32_t * inputDataUnsigned = (uint32_t *) (*env)->GetIntArrayElements(env,inputDataJava,0); 

} 

感謝

+0

這是C還是C++?請做出決定。對於C來說,這絕對是你不應該做的一件黑客。 (我認爲對於C++也是如此,但不是絕對的......)只需訪問並轉換*值*即可。 –

+0

它是C.編輯。謝謝。 – ben

+1

然後,我已經足以刪除C++標籤了。因此,如果它是C,我可以確定通過不兼容類型的指針訪問值是不允許的。轉換值本身。 –

回答

0

是從jint *(32位有符號)這個轉換爲uint32_t的*有效?

總之,沒有。在這樣的演員陣容會導致相當一些不良行爲的情況下,實現可能存在。


它的工作原理,但它似乎是一個黑客。

許多不確定的行爲,似乎工作,至少在最初階段,對於一個配置......直到有人注意到心臟出血漏洞或未定義的行爲似乎已經引起的,例如一些其他的漏洞。事實上,人們往往會用一個字節溢出他們的陣列,它們的計劃將繼續運行......


有極少數類型的指針,其有足夠的鬆動在任何類型的指向對齊要求。我唯一知道的C標準是字符指針類型(char *,signed char *,unsigned char *)和void *

複雜的事情是,該標準不知道這個jint *也沒有任何對齊的要求。我不會相信這樣的代碼。請參閱C標準的相關轉換部分以瞭解可接受的內容:6.3.2.3 Pointers爲方便起見,請參閱下面的引用。作爲一名程序員,你通常希望避開任何「未定義」的東西。

1可以將指向void的指針轉換爲或指向任何對象類型的指針。指向任何對象類型的指針可以轉換爲指向void的指針並返回;結果應與原始指針相等。

2對於任何限定符q,可以將指向非q限定類型的指針轉​​換爲指向q類限定版本的指針;存儲在原始指針和轉換指針中的值應該相等。

3一個整數常量表達式的值爲0,或者這樣一個表達式類型爲void *,被稱爲空指針常量。 66)如果將空指針常量轉換爲指針類型,那麼稱爲空指針的結果指針將保證與指向任何對象或函數的指針進行比較。

4將空指針轉換爲另一個指針類型會產生該類型的空指針。任何兩個空指針應該相等。

5整數可以轉換爲任何指針類型。除了之前指定的以外,結果是實現定義的,可能沒有正確對齊,可能不指向引用類型的實體,並且可能是陷阱表示。67)

6任何指針類型都可以轉換爲整數類型。除了以前指定的,結果是實現定義的。如果結果不能用整數類型表示,則行爲是未定義的。結果不需要在任何整數類型的值的範圍內。

7指向對象類型的指針可能會轉換爲指向不同對象類型的指針。如果結果指針未被正確對齊68)作爲引用類型,行爲是未定義的。否則,當再次轉換時,結果應與原始指針相等。當一個對象的指針轉換爲一個指向字符類型的指針時,結果指向該對象的最低尋址字節。連續遞增的結果,直到對象的大小,產生指向對象剩餘字節的指針。

8指向一種類型函數的指針可能會轉換爲指向另一種類型函數的指針並返回;結果應與原始指針相等。如果使用轉換的指針來調用其類型與引用類型不兼容的函數,則行爲是未定義的。