簡體   English   中英

無法使用frama-c分析openmp代碼

[英]cant analysis openmp code with frama-c

我是frama-c的新手。 我嘗試使用openmp指令在以下c代碼上運行值分析插件:

static void kernel_2mm(int ni, int nj, int nk, int nl, float alpha,
    float beta, float *tmp, float *A, float *B, float *C, float *D) {
int i, j, k;
/* D := alpha*A*B*C + beta*D */
#pragma omp parallel for collapse(2) 
for (i = 0; i < ni; i++)
    for (j = 0; j < nj; j++) {
        tmp[i * nj + j] = 0.0;
        for (k = 0; k < nk; ++k)
            tmp[i * nj + j] += alpha * A[i * nk + k] * B[k * nj + j];
    }
#pragma omp parallel for collapse(2) 
for (i = 0; i < ni; i++)
    for (j = 0; j < nl; j++) {
        D[i * nl + j] *= beta;
        for (k = 0; k < nj; ++k)
            D[i * nl + j] += tmp[i * nj + k] * C[k * nl + j];
    }

}

但是我遇到了以下錯誤:

rouki@rouki-VirtualBox:~/Téléchargements/frama-c$ frama-c -val  2mm_mp.c
[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i
    (no preprocessing)
[kernel] Parsing 2mm_mp.c (with preprocessing)
[kernel] syntax error at 2mm_mp.c:78:
    76      int i, j, k;
    77      /* D := alpha*A*B*C + beta*D */
    78      #pragma omp parallel for collapse(2) 
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    79        for (i = 0; i < ni; i++)
    80          for (j = 0; j < nj; j++) {
[kernel] Frama-C aborted: invalid user input.

當我嘗試使用以下方法將-fopenmp標志添加到預處理程序選項中時:

frama-c -machdep gcc_x86_64 -val -cpp-command 'gcc -fopenmp -C -E -I. ' 2mm_mp.c 

我又收到一條錯誤消息:

[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i
    (no preprocessing)
[kernel] warning: your preprocessor is not known to handle option `-nostdinc'.
    If pre-processing fails because of it, please add
    -no-cpp-frama-c-compliant option to Frama-C's command-line.
    If you do not want to see this warning again, explicitly use option
    -cpp-frama-c-compliant.
[kernel] warning: your preprocessor is not known to handle option `-dD'.
    If pre-processing fails because of it, please add -no-cpp-frama-c-compliant
    option to Frama-C's command-line.
    If you do not want to see this warning again, explicitly use option
    -cpp-frama-c-compliant. 
[kernel] Parsing 2mm_mp.c (with preprocessing)
[kernel] warning: trying to preprocess annotation with an
    unknown preprocessor. 
[kernel] syntax error at 2mm_mp.c:78:
    76      int i, j, k;
    77      /* D := alpha*A*B*C + beta*D */
    78      #pragma omp parallel for collapse(2) 
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    79        for (i = 0; i < ni; i++)
    80          for (j = 0; j < nj; j++) {
[kernel] Frama-C aborted: invalid user input.

如何使frama-c可以分析代碼openmp?

有沒有一種方法可以強制frama-c使用gcc以外的其他編譯器(例如:clang,pgcc)?

我使用帶有gcc的frama-c Phosphorus-20170501版本(Ubuntu 5.4.0-6ubuntu1〜16.04.5)。

回答第一個問題( 如何使Frama-C可以使用openmp分析代碼?

目前,Frama-C不支持OpenMP編譯指示(最高包括Frama-C 16 Sulphur)。

Frama-C嘗試解析所遇到的語用表,在某些情況下只會忽略它們,但在其他情況下(如您遇到的情況),它將嘗試解析它們並失敗。 這些實用程序不是C標准的一部分,它們構成了實現定義的編譯器擴展。 Frama-C會根據具體情況支持某些編譯指示,例如#pragma pack()

還要指出的是使用-cpp-command不再推薦,如果你可以使用-cpp-extra-args代替。 在您的情況下,使用它將意味着使用-cpp-extra-args="-fopenmp" 但這並不是很有幫助,因為無論如何都不支持這些實用程序,但是它應該避免您提到的額外警告。

恐怕目前,最好的解決方案是手動注釋掉這些雜物,然后嘗試再次解析源。

回答第二個問題( 是否有一種方法可以強制frama-c使用gcc以外的其他編譯器(例如:clang,pgcc)?

是的,確實像這樣使用-cpp-command即可。 但是,這里對C編譯鏈有一個很好的了解是有幫助的。 特別是,通常推薦的處理某些特定於體系結構的問題(例如自定義stdlib標頭和非標准功能)的方法是使用編譯器生成經過預處理的代碼(例如gcc -E <inputs> -o file.i ),然后將該文件提供給Frama-C。

請注意,特別是在OpenMP的情況下,GCC使用的編譯指示不會通過預處理除去(這是合乎邏輯的,因為在編譯過程中會預處理之后使用這些編譯指示),因此這對您沒有幫助。 但這確實有幫助,例如,當使用特定於MSVC的代碼時,其中包括Microsoft SDK中的多個stdlib標頭與GNU libc中的標頭不兼容)。

最后,請記住,Frama-C僅將gcc(或其他編譯器)用於預處理源。 其余的編譯鏈未使用。 因此,從GCC和Clang切換更改結果的情況並不常見,因為兩者在預處理方面都實現了非常相似的功能。 同樣,通常可以僅使用-cpp-extra-args代替-cpp-command ,主要是在-cpp-extra-args不存在時才推薦使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM