代码之家  ›  专栏  ›  技术社区  ›  user366312

为什么这个程序通过了测试?

  •  0
  • user366312  · 技术社区  · 3 年前

    以下例程有一个错误。

    线路

    C = (float*)malloc(N * sizeof(float));
    

    应该是

    C = (float*)malloc(N*N * sizeof(float));    
    

    也就是说,分配的内存比所需的要少得多。

    然而,这个程序正在通过测试。

    为什么?

    源代码

    void Multiply(float* A, float* B, float* &C, int N)
    {
        C = (float*)malloc(N * sizeof(float));
        // B is already transposed
        int loc_a, loc_b, loc_c;
        printf("In Multiply\n");
        for (int i =0; i< N; i++) {
            for (int j = 0; j<N;j++) {
                loc_c = i*N+j;
                loc_a = i*N;
                loc_b = j*N;
                C[loc_c] = 0.0f;
                for (int k=0;k<N;k++) {
                    float temp = A[loc_a]*B[loc_b];
                    C[loc_c] += temp;
                    loc_a++;
                    loc_b++;
                }
            }
        }
    }
    

    单元测试

    TEST(matrix_hpp_test, matrix_multiply_with_tanspose)
    {
        float *A = nullptr;
        float *B = nullptr;
        float *C = nullptr;
        CreateMatrix(A, 3, 1.0, 2.0, 3.0,
                                     4.0, 5.0, 6.0,
                                     7.0, 8.0, 9.0);
        CreateMatrix(B, 3, 1.0, 4.0, 7.0,
                                     2.0, 5.0, 8.0,
                                     3.0, 6.0, 9.0);
        Multiply(A, B, C, 3);
        ASSERT_EQ(C[0], 30);
        ASSERT_EQ(C[1], 36);
        ASSERT_EQ(C[2], 42);
        ASSERT_EQ(C[3], 66);
        ASSERT_EQ(C[4], 81);
        ASSERT_EQ(C[5], 96);
        ASSERT_EQ(C[6], 102);
        ASSERT_EQ(C[7], 126);
        ASSERT_EQ(C[8], 150);
    }
    

    输出

    C:\git\test_run.exe --gtest_color=no
    Testing started at 7:14 AM ...
    Running 1 calendar_tests from 1 calendar_tests suite.[----------] Global calendar_tests environment set-up.
    [----------] 1 calendar_tests from matrix_hpp_test
    In Multiply
    [----------] 1 calendar_tests from matrix_hpp_test (0 ms total)
    
    [----------] Global calendar_tests environment tear-down
    1 calendar_tests from 1 calendar_tests suite ran. (0 ms total)[  PASSED  ] 1 calendar_tests.
    Process finished with exit code 0
    
    1 回复  |  直到 3 年前
        1
  •  3
  •   ikegami Gilles Quénot    3 年前

    未定义的行为意味着任何事情都可能发生,包括你想要的行为。但你不能指望它。它会随着蝴蝶翅膀的拍打而变化,这意味着任何事情都可能使它表现得不同。不同的操作系统、编译器或程序早期发生的不同事情。

    -fsanitize=address valgrind 可以帮助查找此类错误。