Вот код, который я соединил на основе примера из этого блога: ССЫЛКА и этот источник: ССЫЛКА .
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();
}
}
На ум приходят два: Splint для C и Cppcheck для C ++.
Если вы хотите посмотреть для дополнительных опций эта функция этих инструментов - «статический анализ кода». Это может помочь вам найти больше инструментов для C и / или C ++. Также вас может заинтересовать ответ на вопрос «Какие инструменты статического анализа C ++ с открытым исходным кодом доступны?»
Я использовал Klocwork и Rational Software Analyzer в прошлом, и они оба работают хорошо, хотя оба являются коммерческими / платными.
C ++ - достаточно сложный язык, поэтому инструменты для него (такие как инструменты рефакторинга или статического анализа) не так хороши, как Java или C #.
ПК Gimpel Software -lint - это наиболее близкий мне стандартный инструмент для проверки ошибок C ++, о котором я знаю. Это коммерческий вариант с разумной ценовой моделью. Я не знаю, насколько хорошо он интегрируется с другими инструментами.
Проект с открытым исходным кодом Clang в конечном итоге должен иметь возможность делать многое из того, что вы хотите (и выглядит действительно круто) , но он все еще находится в разработке.
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"