2017-06-23 81 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指向一种类型函数的指针可能会转换为指向另一种类型函数的指针并返回;结果应与原始指针相等。如果使用转换的指针来调用其类型与引用类型不兼容的函数,则行为是未定义的。