首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ceedling/CMock:将va_list添加到:treat_as_array:生成TypeError

Ceedling/CMock:将va_list添加到:treat_as_array:生成TypeError
EN

Stack Overflow用户
提问于 2022-07-19 08:52:45
回答 1查看 153关注 0票数 0

我正在为一些非开源继承的代码开发一些单元测试。目前,我刚刚测试了割让框架,使用了自动生成的测试来确保一切按其应有的方式运行。

当我对没有依赖项的模块运行测试时,但是当对其中一个模块运行带有一组依赖项的测试时(我必须将其包含为模拟),一切都很好:

代码语言:javascript
复制
#ifdef TEST

#include "unity.h"

#include "conn.h"
#include "mock_log.h"
#include "mock_memory.h"
#include "mock_rxbuffer.h"
#include "mock_txbuffer.h"


void setUp(void)
{
}

void tearDown(void)
{
}

void test_conn_NeedToImplement(void)
{
    TEST_IGNORE_MESSAGE("Need to Implement conn");
}

#endif // TEST

在模拟以下函数时,Ceedling遇到一个错误:

代码语言:javascript
复制
void tx_push (struct txbuffer *tx, const char *format, va_list ap)

错误保护程序如下:

代码语言:javascript
复制
Test 'test_conn.c'
------------------
Generating runner for test_conn.c...
Compiling test_conn_runner.c...
Compiling mock_txbuffer.c...
build/test/mocks/mock_txbuffer.c: In function ‘CMockExpectParameters_tx_push’:
build/test/mocks/mock_txbuffer.c:420:31: warning: ‘sizeof’ on array function parameter ‘ap’ will return size of ‘__va_list_tag *’ [-Wsizeof-array-argument]
          sizeof(va_list[sizeof(ap) == sizeof(va_list) ? 1 : -1])); /* add va_list to :treat_as_array if this causes an error */
                               ^
build/test/mocks/mock_txbuffer.c:414:149: note: declared here
 void CMockExpectParameters_tx_push(CMOCK_tx_push_CALL_INSTANCE* cmock_call_instance, struct txbuffer* tx, int tx_Depth, const char* format, va_list ap)
                                                                                                                                                     ^~
build/test/mocks/mock_txbuffer.c:420:24: error: size of unnamed array is negative
          sizeof(va_list[sizeof(ap) == sizeof(va_list) ? 1 : -1])); /* add va_list to :treat_as_array if this causes an error */
                        ^
ERROR: Shell command failed.

因此,正如我在:treat_as_array中添加的消息所建议的那样:

代码语言:javascript
复制
:cmock:
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :array
    - :ignore
    - :callback
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8
  :treat_as_array:
      - va_list
  :includes:
    - <assert.h>
    - <getopt.h>
    - <libgen.h>
    - <stdbool.h>
    - <stdint.h>
    - <stdio.h>
    - <stdlib.h>
    - <string.h>

完成此操作后,我得到了一个新错误(在调试中运行ceedling ),其形式为:

TypeError:没有将字符串隐式转换为整数

代码语言:javascript
复制
** Invoke test:conn (first_time)
** Invoke test/test_conn.c (first_time, not_needed)
** Execute test:conn
** Invoke test_deps (first_time)
** Invoke directories (first_time)
** Invoke build/test/mocks (first_time, not_needed)
** Invoke build/artifacts (first_time, not_needed)
** Invoke build/test (first_time, not_needed)
** Invoke build/artifacts/test (first_time, not_needed)
** Invoke build/test/runners (first_time, not_needed)
** Invoke build/test/results (first_time, not_needed)
** Invoke build/test/out (first_time, not_needed)
** Invoke build/test/out/asm (first_time, not_needed)
** Invoke build/test/out/c (first_time, not_needed)
** Invoke build/test/cache (first_time, not_needed)
** Invoke build/test/dependencies (first_time, not_needed)
** Invoke build/logs (first_time, not_needed)
** Invoke build/temp (first_time, not_needed)
** Invoke build/test/preprocess/includes (first_time, not_needed)
** Invoke build/test/preprocess/files (first_time, not_needed)
** Invoke build/gcov/out (first_time, not_needed)
** Invoke build/gcov/results (first_time, not_needed)
** Invoke build/gcov/dependencies (first_time, not_needed)
** Invoke build/artifacts/gcov (first_time, not_needed)
** Execute directories
** Execute test_deps


Test 'test_conn.c'
------------------
Verbose: exec(): gcc -E -MM -MG -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "build/temp/_test_conn.c"
> Shell executed command:
'gcc -E -MM -MG -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "build/temp/_test_conn.c"'
> Produced output:
_test_conn.o: build/temp/_test_conn.c \
 /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
 /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \
 @@@@unity.h src/conn.h @@@@conn.h mock_log.h @@@@mock_log.h \
 mock_memory.h @@@@mock_memory.h mock_rxbuffer.h @@@@mock_rxbuffer.h \
 mock_txbuffer.h @@@@mock_txbuffer.h

** Invoke build/test/preprocess/includes/log.h (first_time, not_needed)
** Invoke src/log.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/log.h" -o "build/test/preprocess/files/log.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/log.h" -o "build/test/preprocess/files/log.h"'

** Invoke build/test/preprocess/includes/memory.h (first_time, not_needed)
** Invoke src/memory.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/memory.h" -o "build/test/preprocess/files/memory.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/memory.h" -o "build/test/preprocess/files/memory.h"'

** Invoke build/test/preprocess/includes/rxbuffer.h (first_time, not_needed)
** Invoke src/rxbuffer.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/rxbuffer.h" -o "build/test/preprocess/files/rxbuffer.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/rxbuffer.h" -o "build/test/preprocess/files/rxbuffer.h"'

** Invoke build/test/preprocess/includes/txbuffer.h (first_time, not_needed)
** Invoke src/txbuffer.h (first_time, not_needed)
Verbose: exec(): gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/txbuffer.h" -o "build/test/preprocess/files/txbuffer.h"
> Shell executed command:
'gcc -E -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src" -I"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src" -I"build/test/mocks" -I"test" -I"test/support" -I"src" -DTEST -DTEST -DGNU_COMPILER "src/txbuffer.h" -o "build/test/preprocess/files/txbuffer.h"'

** Invoke build/test/mocks/mock_log.c (first_time)
** Invoke build/test/cache/log.h (first_time, not_needed)
** Execute build/test/mocks/mock_log.c
Creating mock for log...
rake aborted!
TypeError: no implicit conversion of String into Integer
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:421:in `block in parse_args'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:411:in `each'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:411:in `parse_args'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:588:in `parse_declaration'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:45:in `block in parse'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:44:in `map'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:44:in `parse'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:48:in `generate_mock'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:32:in `block in setup_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:31:in `each'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:31:in `setup_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/generator.rb:50:in `generate_mock'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/rules_cmock.rake:8:in `block in <top (required)>'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:60:in `block in invoke_test_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:58:in `invoke_test_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/preprocessinator.rb:28:in `preprocess_test_and_invoke_test_mocks'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:84:in `block in setup_and_invoke'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:51:in `each'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:51:in `setup_and_invoke'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/rules_tests.rake:70:in `block (2 levels) in <top (required)>'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/bin/ceedling:345:in `block in <top (required)>'
/var/lib/gems/2.5.0/gems/ceedling-0.31.1/bin/ceedling:332:in `<top (required)>'
/usr/local/bin/ceedling:23:in `load'
/usr/local/bin/ceedling:23:in `<main>'
Tasks: TOP => build/test/mocks/mock_log.c
(See full trace by running task with --trace)

--------------------
OVERALL TEST SUMMARY
--------------------

No tests executed.

如果我从va_list中删除:treat_as_array,我可以成功地测试具有依赖关系的模块,只要它们没有以va_list作为输入的函数。否则,即使没有va_list函数,我仍然会得到相同的错误:

TypeError:没有将字符串隐式转换为整数

所以在我看来,我把va_list:treat_as_array的方式可能有问题。

到了这一点,我对该尝试什么的想法更少了。我还打开了一个关于割让的集散地问题,说明了这个问题,但我希望从其他可能遇到这个问题的用户那里得到一些输入。

我的许可版本如下(Ubuntu18.04.2):

代码语言:javascript
复制
   Ceedling:: 0.31.1
      Unity:: 2.5.4
      CMock:: 2.5.4
 CException:: 1.3.3

在堆栈交换中有一个类似的问题,我看到了这里,但是没有将va_list添加到:treat_as_array的额外步骤。

还有几个github问题涉及缺乏对各种功能的支持:

,所以我想我只想弄清楚这是一个不受支持的特性,还是我做错了什么。

任何帮助都会得到无偿的帮助。

向你问好GCT。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 12:48:13

因此,我似乎错误地添加了va_list。

它必须是:

代码语言:javascript
复制
  :treat_as_array:
    va_list

现在cmock不再抱怨被模仿的模块。

我找不到任何例子来说明如何向:treat_as_array添加一些内容:,希望这会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73033962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档