Парсер Clang с кодом python для C не разбирает некоторые строки - PullRequest
1 голос
/ 17 июня 2020

Я использую библиотеку clang.cindex на python для синтаксического анализа кода C. Однако некоторые строки кода не читаются парсером.

Вот мой python код, отображающий все узлы файла:

import sys
from clang.cindex import *


def visit(node: Cursor):
    print(node.displayname + ' ' + str(node.location))
    for child in node.get_children():
        visit(child)


if __name__ == '__main__':
    index = Index.create()
    tu = index.parse(sys.argv[1], options=TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD)
    visit(tu.cursor)

Вот мой C код (файл crypto / crc32c_generi c. c ядра linux), который я пытаюсь разобрать:

// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Cryptographic API.
 *
 * CRC32C chksum
 *
 *@Article{castagnoli-crc,
 * author =       { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
 * title =        {{Optimization of Cyclic Redundancy-Check Codes with 24
 *                 and 32 Parity Bits}},
 * journal =      IEEE Transactions on Communication,
 * year =         {1993},
 * volume =       {41},
 * number =       {6},
 * pages =        {},
 * month =        {June},
 *}
 * Used by the iSCSI driver, possibly others, and derived from the
 * the iscsi-crc.c module of the linux-iscsi driver at
 * http://linux-iscsi.sourceforge.net.
 *
 * Following the example of lib/crc32, this function is intended to be
 * flexible and useful for all users.  Modules that currently have their
 * own crc32c, but hopefully may be able to use this one are:
 *  net/sctp (please add all your doco to here if you change to
 *            use this one!)
 *  <endoflist>
 *
 * Copyright (c) 2004 Cisco Systems, Inc.
 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
 */

#include <asm/unaligned.h>
#include <crypto/internal/hash.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/crc32.h>

#define CHKSUM_BLOCK_SIZE   1
#define CHKSUM_DIGEST_SIZE  4

struct chksum_ctx {
    u32 key;
};

struct chksum_desc_ctx {
    u32 crc;
};

/*
 * Steps through buffer one byte at at time, calculates reflected
 * crc using table.
 */

static int chksum_init(struct shash_desc *desc)
{
    struct chksum_ctx *mctx = crypto_shash_ctx(desc->tfm);
    struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);

    ctx->crc = mctx->key;

    return 0;
}

/*
 * Setting the seed allows arbitrary accumulators and flexible XOR policy
 * If your algorithm starts with ~0, then XOR with ~0 before you set
 * the seed.
 */
static int chksum_setkey(struct crypto_shash *tfm, const u8 *key,
             unsigned int keylen)
{
    struct chksum_ctx *mctx = crypto_shash_ctx(tfm);

    if (keylen != sizeof(mctx->key))
        return -EINVAL;
    mctx->key = get_unaligned_le32(key);
    return 0;
}

static int chksum_update(struct shash_desc *desc, const u8 *data,
             unsigned int length)
{
    struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);

    ctx->crc = __crc32c_le(ctx->crc, data, length);
    return 0;
}

static int chksum_final(struct shash_desc *desc, u8 *out)
{
    struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);

    put_unaligned_le32(~ctx->crc, out);
    return 0;
}

static int __chksum_finup(u32 *crcp, const u8 *data, unsigned int len, u8 *out)
{
    put_unaligned_le32(~__crc32c_le(*crcp, data, len), out);
    return 0;
}

static int chksum_finup(struct shash_desc *desc, const u8 *data,
            unsigned int len, u8 *out)
{
    struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);

    return __chksum_finup(&ctx->crc, data, len, out);
}

static int chksum_digest(struct shash_desc *desc, const u8 *data,
             unsigned int length, u8 *out)
{
    struct chksum_ctx *mctx = crypto_shash_ctx(desc->tfm);

    return __chksum_finup(&mctx->key, data, length, out);
}

static int crc32c_cra_init(struct crypto_tfm *tfm)
{
    struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);

    mctx->key = ~0;
    return 0;
}

static struct shash_alg alg = {
    .digestsize     =   CHKSUM_DIGEST_SIZE,
    .setkey         =   chksum_setkey,
    .init       =   chksum_init,
    .update     =   chksum_update,
    .final      =   chksum_final,
    .finup      =   chksum_finup,
    .digest     =   chksum_digest,
    .descsize       =   sizeof(struct chksum_desc_ctx),
    .base           =   {
        .cra_name       =   "crc32c",
        .cra_driver_name    =   "crc32c-generic",
        .cra_priority       =   100,
        .cra_flags      =   CRYPTO_ALG_OPTIONAL_KEY,
        .cra_blocksize      =   CHKSUM_BLOCK_SIZE,
        .cra_ctxsize        =   sizeof(struct chksum_ctx),
        .cra_module     =   THIS_MODULE,
        .cra_init       =   crc32c_cra_init,
    }
};

static int __init crc32c_mod_init(void)
{
    return crypto_register_shash(&alg);
}

static void __exit crc32c_mod_fini(void)
{
    crypto_unregister_shash(&alg);
}

subsys_initcall(crc32c_mod_init);
module_exit(crc32c_mod_fini);

MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c");
MODULE_LICENSE("GPL");
MODULE_ALIAS_CRYPTO("crc32c");
MODULE_ALIAS_CRYPTO("crc32c-generic");

Проблема в том, что парсер не возвращает ни одного узла для put_unaligned_le32 call:

static int chksum_final(struct shash_desc *desc, u8 *out)
{
    struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);

    put_unaligned_le32(~ctx->crc, out);
    return 0;
}

Кто-нибудь знает, почему я не могу разобрать эту строку? Есть решение? Я много дней ищу безрезультатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...