参数类型对于此链接类型的函数无效

Posted

技术标签:

【中文标题】参数类型对于此链接类型的函数无效【英文标题】:The parameter type is not valid for a function of this linkage type 【发布时间】:2017-09-08 20:54:07 【问题描述】:

我正在使用 IBM 的 XL C 编译器开发 AIX。我遇到了一个编译错误,我不确定如何继续:

$ xlc -g3 -O0 -qarch=pwr8 -qaltivec fips197-p8.c -o fips197-p8.exe
"fips197-p8.c", line 59.16: 1506-754 (W) The parameter type is not valid for a function of this linkage type.

相关源代码如下所示。完整的源代码可在fips197-p8.c 获得。源代码是 Power 8 __cipher__vcipherlast 的测试驱动程序。它有一个主函数和几个 C 函数。 Effectively 是 Power 8 AES 的最小完整工作示例。

$ cat -n fips197-p8.c
...

11  #if defined(__xlc__) || defined(__xlC__)
12  // #include <builtins.h>
13  #include <altivec.h>
14  typedef vector unsigned char uint8x16_p8;
15  typedef vector unsigned int uint64x2_p8;
16  #else
17  #include <altivec.h>
18  typedef vector unsigned char uint8x16_p8;
19  typedef vector unsigned long long uint64x2_p8;
20  #endif
...

52  uint8x16_p8 Load8x16(const uint8_t src[16])
53  
54  #if defined(__xlc__) || defined(__xlC__)
55          /* IBM XL C/C++ compiler */
56  # if defined(__LITTLE_ENDIAN__)
57          return vec_xl_be(0, src);
58  # else
59          return vec_xl(0, src);
60  # endif
61  #else
62          /* GCC, Clang, etc */
63
64  #endif
65  

编译器版本如下所示。我们不控制编译器,所以这就是我们所拥有的:

$ xlc -qversion
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07)
Version: 13.01.0003.0000

vec_xl 在 little-endian 上很好。 vec_xl for big-endian 给我们带来了麻烦。

有什么问题,我该如何解决?

【问题讨论】:

AIX + IBM?你有我的同情 但是,如果没有 AIX,这很难重现。 IBM 在这里并不是特别有用。 来自文档:“当 -qaltivec=be 生效时,函数结果中元素的顺序为大端。否则,顺序为小端。”你没有设置=be,这不是问题吗? src 转换成const unsigned char* 效果会更好吗? 我可能有一个想法:也许这个东西可以正常工作,const uint8_t src[16] 应该是uint8_t src[16] 【参考方案1】:

所以一点猜测(由 OP cmets 确认,因为它有效)让我认为这个神秘而晦涩的“参数类型对于这种链接类型的函数无效。”消息(谷歌第一个匹配是这个问题!)可能是 qualifier 问题。

因为你的合同是

uint8x16_p8 Load8x16(const uint8_t src[16])

考虑到选项和当前字节序,编译器/原型有可能认为vec_xl_be 需要一个非常量 参数作为src

因此传递const 违反了合同(这是xlc 可以找到通知您的最佳方式)

所以要么改成

uint8x16_p8 Load8x16(uint8_t src[16])

(有放弃对所有调用者的恒定约束的风险)

或通过非常量转换删除const(就像我们在原型缺少const时所做的那样,但实际上函数中没有修改数据):

vec_xl_be(0,(uint8_t*)src);

【讨论】:

谢谢。我还找到了IV91684: PARAMETER TYPE ERROR FOR VECTOR BUILT-INS VEC_CMPGE AND VEC_CMPLE。我想这就是修补程序的意义所在。我没有使用 XL C/C++ 编译器来连接这些点。 很好的发现。但在我看来,这是一种“同症异因”。这提醒我们gcc 对我们很好:) 感谢您提出此问题,并对误导性诊断表示歉意。编译器试图为您挽救一个糟糕的情况,即您可能会将 const 参数传递给非常量接口,但可以改进错误消息。 @trudaun:那个,或者它不应该首先提出它,或者考虑到编译开关,原型被破坏了。无论如何,我无法测试它,因为我没有代码或 AIX 机器......很高兴它成功了 :)

以上是关于参数类型对于此链接类型的函数无效的主要内容,如果未能解决你的问题,请参考以下文章

参数数据类型 text 对于 replace 函数的参数 1 无效

Sqlserver 报错“参数数据类型 ntext/text 对于 replace 函数的参数 1 无效”的解决方案及原理分析扩展

Snowflake SQL 错误 - 函数“-”的参数类型无效:(TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9))

返回列表的总和:错误:参数的“类型”(列表)无效

SQL 参数数据类型 int 对 charindex 函数的参数 1 无效

Symfony 4:参数的类型提示无效