Существует ли Findbugs и / или эквивалент PMD для C/C++? [закрытый]

Вот код, который я соединил на основе примера из этого блога: ССЫЛКА и этот источник: ССЫЛКА .

import com.sun.jndi.ldap.LdapCtxFactory;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Iterator;
import javax.naming.Context;
import javax.naming.AuthenticationException;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import static javax.naming.directory.SearchControls.SUBTREE_SCOPE;

class App2 {

    public static void main(String[] args) {

        if (args.length != 4 && args.length != 2) {
            System.out.println("Purpose: authenticate user against Active Directory and list group membership.");
            System.out.println("Usage: App2    ");
            System.out.println("Short usage: App2  ");
            System.out.println("(short usage assumes 'xyz.tld' as domain and 'abc' as server)");
            System.exit(1);
        }

        String domainName;
        String serverName;

        if (args.length == 4) {
            domainName = args[2];
            serverName = args[3];
        } else {
            domainName = "xyz.tld";
            serverName = "abc";
        }

        String username = args[0];
        String password = args[1];

        System.out
                .println("Authenticating " + username + "@" + domainName + " through " + serverName + "." + domainName);

        // bind by using the specified username/password
        Hashtable props = new Hashtable();
        String principalName = username + "@" + domainName;
        props.put(Context.SECURITY_PRINCIPAL, principalName);
        props.put(Context.SECURITY_CREDENTIALS, password);
        DirContext context;

        try {
            context = LdapCtxFactory.getLdapCtxInstance("ldap://" + serverName + "." + domainName + '/', props);
            System.out.println("Authentication succeeded!");

            // locate this user's record
            SearchControls controls = new SearchControls();
            controls.setSearchScope(SUBTREE_SCOPE);
            NamingEnumeration renum = context.search(toDC(domainName),
                    "(& (userPrincipalName=" + principalName + ")(objectClass=user))", controls);
            if (!renum.hasMore()) {
                System.out.println("Cannot locate user information for " + username);
                System.exit(1);
            }
            SearchResult result = renum.next();

            List groups = new ArrayList();
            Attribute memberOf = result.getAttributes().get("memberOf");
            if (memberOf != null) {// null if this user belongs to no group at all
                for (int i = 0; i < memberOf.size(); i++) {
                    Attributes atts = context.getAttributes(memberOf.get(i).toString(), new String[] { "CN" });
                    Attribute att = atts.get("CN");
                    groups.add(att.get().toString());
                }
            }

            context.close();

            System.out.println();
            System.out.println("User belongs to: ");
            Iterator ig = groups.iterator();
            while (ig.hasNext()) {
                System.out.println("   " + ig.next());
            }

        } catch (AuthenticationException a) {
            System.out.println("Authentication failed: " + a);
            System.exit(1);
        } catch (NamingException e) {
            System.out.println("Failed to bind to LDAP / get account information: " + e);
            System.exit(1);
        }
    }

    private static String toDC(String domainName) {
        StringBuilder buf = new StringBuilder();
        for (String token : domainName.split("\\.")) {
            if (token.length() == 0)
                continue; // defensive check
            if (buf.length() > 0)
                buf.append(",");
            buf.append("DC=").append(token);
        }
        return buf.toString();
    }

}

18
задан Bob Cross 16 September 2009 в 15:14
поделиться

4 ответа

На ум приходят два: Splint для C и Cppcheck для C ++.

Если вы хотите посмотреть для дополнительных опций эта функция этих инструментов - «статический анализ кода». Это может помочь вам найти больше инструментов для C и / или C ++. Также вас может заинтересовать ответ на вопрос «Какие инструменты статического анализа C ++ с открытым исходным кодом доступны?»

3
ответ дан 30 November 2019 в 09:35
поделиться

Я использовал Klocwork и Rational Software Analyzer в прошлом, и они оба работают хорошо, хотя оба являются коммерческими / платными.

0
ответ дан 30 November 2019 в 09:35
поделиться

C ++ - достаточно сложный язык, поэтому инструменты для него (такие как инструменты рефакторинга или статического анализа) не так хороши, как Java или C #.

ПК Gimpel Software -lint - это наиболее близкий мне стандартный инструмент для проверки ошибок C ++, о котором я знаю. Это коммерческий вариант с разумной ценовой моделью. Я не знаю, насколько хорошо он интегрируется с другими инструментами.

Проект с открытым исходным кодом Clang в конечном итоге должен иметь возможность делать многое из того, что вы хотите (и выглядит действительно круто) , но он все еще находится в разработке.

3
ответ дан 30 November 2019 в 09:35
поделиться

PC-Lint - это то, что вам нужно. В отличие от большинства других инструментов, он имеет полное межфункциональное и межмодульное отслеживание значений, а также поддерживает все сложные аспекты компиляции / анализа шаблонов. Я купил себе личный экземпляр лет 9 назад просто потому, что он такой дешевый. В итоге я стал много использовать его в проектах с открытым исходным кодом. PC-Lint не лицензирует на основе LOC, он не звонит домой, и нет сервера лицензий. Это очень важно для системы чести и очень серьезного смысла. За 9 лет я обнаружил в нем некоторые проблемы (а их было немного и они были редкостью), но они почти всегда исправлялись в течение нескольких недель.

С открытым исходным кодом есть SMatch, основанный на Coverity's методы анализа мета-компиляции, которые винный проект довольно интенсивно использует с большим эффектом. PMD ' Вспомогательный инструмент cpd (детектор копирования и вставки) работает на C ++ и работает очень быстро. Для цикломатической сложности существует pmccabe, который легко установить с помощью apt-get (в Linux; в Windows я компилирую исходный код под cygwin).

PC-Lint требует некоторой настройки, чтобы заставить его работать нормально, день или два на большинство. Другие инструменты работают не так хорошо, поэтому вы можете сразу приступить к работе с помощью команды вроде "find. -Name .c | xargs pmccabe | sort -n | tail -n 20"

3
ответ дан 30 November 2019 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: