| // Copyright (c) 2020 Intel Corporation |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| // Uses a python database (a dict) to find where const struct device |
| // variable are being used in zephyr functions and, if it's being in place |
| // of a void*, it will print an ERROR for loosing the const qualifier. |
| // If it's being used on an unknown functions from an external module such |
| // as a HAL, it will print a WARNING in order to check if the const qualifier |
| // is not lost. |
| |
| virtual report |
| |
| //////////////////// |
| // Initialization // |
| //////////////////// |
| |
| @initialize:python |
| depends on report |
| @ |
| @@ |
| import pickle |
| |
| def check_and_report(F, f, D, nb_args, p): |
| if f in f_void and int(nb_args) in f_void[f]: |
| msg = "ERROR: in {} calling {} param with {}, \ |
| loosing const qualifier, please wrap".format(F, f, D) |
| coccilib.report.print_report(p[0], msg) |
| elif f not in f_void and f not in f_other and not f.isupper(): |
| msg = "WARNING: in {} calling {} param with {}, \ |
| check if const qualifier is not lost".format(F, f, D) |
| coccilib.report.print_report(p[0], msg) |
| |
| // Loading function data base |
| with open("function_names.pickle", "rb") as f: |
| data = pickle.load(f) |
| f_void = data["f_void"] |
| f_other = data["f_other"] |
| |
| |
| /////////// |
| // Rules // |
| /////////// |
| |
| // Find usage of a device instance |
| @r_find_dev_usage |
| depends on report |
| @ |
| local idexpression struct device *D; |
| expression list[nb_args] args; |
| identifier f; |
| position p; |
| @@ |
| f(args, D@p, ...) |
| |
| |
| @script:python |
| depends on r_find_dev_usage |
| @ |
| f << r_find_dev_usage.f; |
| D << r_find_dev_usage.D; |
| nb_args << r_find_dev_usage.nb_args; |
| p << r_find_dev_usage.p; |
| @@ |
| check_and_report(p[0].current_element, f, D, nb_args, p) |