Оценка возможностей применения инструментов статического анализа в учебном процессе для проверки решений задач по программированию

Статический анализ – процесс выявления ошибок и недочетов в исходном коде, выполняемый без реального выполнения исследуемых программ. Анализ алгоритма обработки сообщения об окончании компиляции и проверки корректности вывода программного приложения.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 14.12.2019
Размер файла 1,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

3. Codesmell[Электронный ресурс] // Wikipedia - Режим доступа: https://en.wikipedia.org/wiki/Code_smell

4. 30+ онлайн ресурсов для изучения программирования в 2017 [Электронный ресурс] / Денис Зарицкий // Хабр - Режим доступа: https://habr.com/ru/post/331530/

5. List of tools for static code analysis [Электронный ресурс] // Wikipedia - Режим доступа:http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

5. awesome-dynamic-analysis [Электронный ресурс] / Matthias Endler // GitHub - Режим доступа: https://github.com/mre/awesome-static-analysis

6. Статический анализ и регулярные выражения [Электронный ресурс] // PVS-Studio-Режим доступа: https://www.viva64.com/ru/b/0087/

7. coala.io [Электронный ресурс]: офиц. сайт. - Режим доступа: https://docs.coala.io/en/latest/index.html

8. Андрианов, И.А. Архитектура электронного ресурса для обучения информационно-коммуникационным технологиям / Андрианов И.А., Петров И.А., Ржеуцкая С.Ю. // Вузовская наука - региону: материалы Всероссийской научной конференции. - Вологда: ВоГТУ, 2008. - С. 44-47.

9. Spring Boot Reference Guide [Электронный ресурс] // Spring Framework - Режим доступа: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

10. Simple Amqp Client [Электронный ресурс] / Alan Antonuk // GitHub - Режим доступа: https://github.com/alanxz/SimpleAmqpClient

11. AMQP 0-9-1 Complete Reference Guide [Электронный ресурс] // RabbitMQ - Режим доступа: https://www.rabbitmq.com/amqp-0-9-1-reference.html

12. jQuery API Documentation [Электронный ресурс] // jQuery - Режим доступа: https://api.jquery.com/

13. Андрианов, И.А. Разработка и особенности использования дистанционного лабораторного практикума по программированию / Андрианов И.А., Менухова Н.О. // Современное общество, образование и наука: Сб. науч. тр. по материалам Между-нар. науч.-практ. конф. 2012. - С. 10-12.

Приложение 1

ЛистингSQL-скриптов задания структур данных

CREATEGENERATORBEAR_GEN;

CREATE TABLE BEAR (

ID_BEAR INTEGER NOT NULL,

NAME VARCHAR(50) NOT NULL

);

ALTER TABLE BEAR ADD PRIMARY KEY (ID_BEAR);

SET TERM ;

CREATE OR ALTER TRIGGER SET_BEAR_ID FOR BEAR

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

new.ID_BEAR = gen_id(BEAR_GEN, 1);

END

SET TERM ;

CREATE TABLE COMPIL_BEAR (

ID_BEAR INTEGER NOT NULL,

ID_CMP INTEGER NOT NULL,

ENABLED CHAR(1) DEFAULT 'y' NOT NULL,

SHOWED CHAR(1) DEFAULT 'y' NOT NULL

);

ALTER TABLE COMPIL_BEAR ADD PRIMARY KEY (ID_BEAR, ID_CMP);

ALTER TABLE COMPIL_BEAR ADD FOREIGN KEY (ID_BEAR) REFERENCES BEAR (ID_BEAR);

ALTER TABLE COMPIL_BEAR ADD FOREIGN KEY (ID_CMP) REFERENCES COMPIL (ID_CMP);

CREATE GENERATOR SOLUTION_ISSUE_GEN;

CREATE TABLE SOLUTION_ISSUE (

ISSUE_ID INTEGER NOT NULL,

ID_STAT INTEGER NOT NULL,

START_LINE INTEGER,

START_COL INTEGER,

END_LINE INTEGER,

END_COL INTEGER,

MESSAGE VARCHAR(1000) NOT NULL,

ID_BEAR INTEGER NOT NULL,

SEVERITY INTEGER NOT NULL

);

ALTER TABLE SOLUTION_ISSUE ADD PRIMARY KEY (ISSUE_ID);

ALTER TABLE SOLUTION_ISSUE ADD FOREIGN KEY (ID_STAT) REFERENCES STATUS (ID_STAT);

ALTER TABLE SOLUTION_ISSUE ADD FOREIGN KEY (ID_BEAR) REFERENCES BEAR (ID_BEAR);

SET TERM ;

CREATE OR ALTER TRIGGER SET_ISSUE_ID FOR SOLUTION_ISSUE

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

new.ISSUE_ID = gen_id(SOLUTION_ISSUE_GEN, 1);

END

SET TERM ;

Приложение 2

Листинг конфигурации сборки проекта Gradle

plugins {

id 'war'

id 'org.springframework.boot' version '2.1.5.RELEASE'

}

apply plugin: 'io.spring.dependency-management'

group 'ru.edu.vstu.atpp'

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {

mavenCentral()

}

dependencies {

implementation "org.springframework.boot:spring-boot-starter-amqp"

implementation 'org.springframework.boot:spring-boot-starter-web'

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

implementation 'org.springframework.boot:spring-boot-starter-security'

implementation 'org.springframework.boot:spring-boot-starter-test'

implementation group: 'org.firebirdsql.jdbc', name: 'jaybird-jdk18', version: '3.0.6'

implementation group: 'org.apache.commons', name: 'commons-exec', version: '1.3'

implementation group: 'commons-io', name: 'commons-io', version: '2.6'

implementation 'com.google.guava:guava:28.0-jre'

testCompile group: 'junit', name: 'junit', version: '4.12'

}

Приложение 3

Листинг сгенерированной JPA-сущности ошибки статического анализа

@Entity

@Table(name = "SOLUTION_ISSUE", schema = "", catalog = "")

public class SolutionIssueEntity {

private int issueId;

private Integer startLine;

private Integer startCol;

private Integer endLine;

private Integer endCol;

private String message;

private int severity;

private StatusEntity statusByIdStat;

private BearEntity bearByIdBear;

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "issueIdGen")

@GenericGenerator(name = "issueIdGen", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",

parameters = {@org.hibernate.annotations.Parameter(name = "sequence_name", value = "SOLUTION_ISSUE_GEN")

})

@Column(name = "ISSUE_ID")

public int getIssueId() {

return issueId;

}

public void setIssueId(int issueId) {

this.issueId = issueId;

}

@Basic

@Column(name = "START_LINE")

public Integer getStartLine() {

return startLine;

}

public void setStartLine(Integer startLine) {

this.startLine = startLine;

}

@Basic

@Column(name = "START_COL")

public Integer getStartCol() {

return startCol;

}

public void setStartCol(Integer startCol) {

this.startCol = startCol;

}

@Basic

@Column(name = "END_LINE")

public Integer getEndLine() {

return endLine;

}

public void setEndLine(Integer endLine) {

this.endLine = endLine;

}

@Basic

@Column(name = "END_COL")

public Integer getEndCol() {

return endCol;

}

public void setEndCol(Integer endCol) {

this.endCol = endCol;

}

@Basic

@Column(name = "MESSAGE")

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

@Basic

@Column(name = "SEVERITY")

public int getSeverity() {

return severity;

}

public void setSeverity(int severity) {

this.severity = severity;

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

SolutionIssueEntity that = (SolutionIssueEntity) o;

return issueId == that.issueId &&

severity == that.severity &&

Objects.equals(startLine, that.startLine) &&

Objects.equals(startCol, that.startCol) &&

Objects.equals(endLine, that.endLine) &&

Objects.equals(endCol, that.endCol) &&

Objects.equals(message, that.message);

}

@Override

public int hashCode() {

return Objects.hash(issueId, startLine, startCol, endLine, endCol, message, severity);

}

@ManyToOne

@JoinColumn(name = "ID_STAT", referencedColumnName = "ID_STAT", nullable = false)

public StatusEntity getStatusByIdStat() {

return statusByIdStat;

}

public void setStatusByIdStat(StatusEntity statusByIdStat) {

this.statusByIdStat = statusByIdStat;

}

@ManyToOne

@JoinColumn(name = "ID_BEAR", referencedColumnName = "ID_BEAR", nullable = false)

public BearEntity getBearByIdBear() {

return bearByIdBear;

}

public void setBearByIdBear(BearEntity bearByIdBear) {

this.bearByIdBear = bearByIdBear;

}

}

Приложение 4

Листинг слушателя сообщений от AMQP-брокера

@Component

public class CheckingCompletionListener {

public static final Logger LOGGER = LoggerFactory.getLogger(CheckingCompletionListener.class);

private StatusRepository statusRepository;

private Analyzer analyzer;

@Autowired

public CheckingCompletionListener(StatusRepository statusRepository, Analyzer analyzer) {

this.statusRepository = statusRepository;

this.analyzer = analyzer;

}

@RabbitListener(queues = "accepted_solutions")

@Transactional

public void processMessage(String content) throws IOException {

Properties properties = new Properties();

properties.load(new StringReader(content));

Integer solutionId = Integer.valueOf(properties.getProperty("id_stat"));

StatusEntity status = statusRepository.findById(solutionId).get();

if (status.getResultsByIdRsl().getIdRsl() != 0) {

LOGGER.info("Решение {} непрошлопроверку. Пропуск статического анализа", solutionId);

return;

}

Map<String, BearEntity> bears = status.getCompilByIdCmp().getCompilBearsByIdCmp().stream()

.filter(CompilBearEntity::isEnabled)

.map(CompilBearEntity::getBearByIdBear)

.collect(Collectors.toMap(BearEntity::getName, bear -> bear));

if (bears.isEmpty()) {

LOGGER.info("Нет доступных модулей проверки. Пропуск проверки. Решение {}", solutionId);

return;

}

List<Issue> issues = analyzer.analyze(new String(status.getObjData()), bears.keySet());

if (issues.isEmpty()) {

LOGGER.info("Проблемы не обнаружены. Решение {}", solutionId);

return;

}

List<SolutionIssueEntity> issueEntities = issues.stream().map(issue -> {

SolutionIssueEntity issueEntity = new SolutionIssueEntity();

issueEntity.setMessage(issue.getMessage());

issueEntity.setStartLine(issue.getStartLine());

issueEntity.setStartCol(issue.getStartCol());

issueEntity.setEndLine(issue.getEndLine());

issueEntity.setEndCol(issue.getEndCol());

issueEntity.setBearByIdBear(bears.entrySet().stream()

.filter(entry -> issue.getBear().contains(entry.getKey())).findAny().get().getValue());

issueEntity.setStatusByIdStat(status);

issueEntity.setSeverity(issue.getSeverity());

return issueEntity;

}).collect(Collectors.toList());

status.setSolutionIssuesByIdStat(issueEntities);

LOGGER.info("Найдено {} проблем. Решение {}", issues.size(), solutionId);

}

}

Приложение 5

Листинги REST-контроллеров

1 Листинг REST-контроллера для пользователей с ролью USER

@RestController

public class UserController {

private IssueMapper issueMapper;

private StatusRepository statusRepository;

@Autowired

public UserController(IssueMapper issueMapper, StatusRepository statusRepository) {

this.issueMapper = issueMapper;

this.statusRepository = statusRepository;

}

@GetMapping("/issues")

@Transactional

public List<Issue> getIssues(@RequestParam("stat_id") Integer statId) {

List<SolutionIssueEntity> issueEntities = statusRepository.findById(statId).get()

.getSolutionIssuesByIdStat().stream().filter(issue ->

issue.getStatusByIdStat().getCompilByIdCmp().getCompilBearsByIdCmp().stream().anyMatch(compilBear ->

compilBear.isShowed() && compilBear.getBearByIdBear() == issue.getBearByIdBear()

)

).sorted((o1, o2) -> o2.getSeverity() - o1.getSeverity()).collect(Collectors.toList());

return issueMapper.convert(issueEntities);

}

}

2 ЛистингREST-контроллерадляпользователейсрольюADMIN

@RestController

@RequestMapping("/admin")

public class AdminController {

private CompilRepository compilRepository;

private CompilBearRepository compilBearRepository;

@Autowired

public AdminController(CompilRepository compilRepository, CompilBearRepository compilBearRepository) {

this.compilRepository = compilRepository;

this.compilBearRepository = compilBearRepository;

}

@GetMapping("/bears")

public List<Compiler> getBears() {

Iterable<CompilEntity> compilers = compilRepository.findAll();

return StreamSupport.stream(compilers.spliterator(), false)

.map(compiler -> new Compiler(compiler.getIdCmp(), compiler.getName().trim(), compiler.getCompilBearsByIdCmp().stream().map(

bear -> new BearStatus(bear.getBearByIdBear().getIdBear(),

bear.getBearByIdBear().getName(),

bear.isEnabled(),

bear.isShowed())).collect(Collectors.toList()))).collect(Collectors.toList());

}

@PostMapping("/analysis-state")

@Transactional

public void analysisState(@RequestParam("compiler_id") Integer compilerId, @RequestParam("bear_id") Integer bearId, @RequestParam("enabled") Boolean enabled) {

compilBearRepository.setEnabled(enabled, compilerId.shortValue(), bearId);

}

@PostMapping("/showing-state")

@Transactional

public void showingState(@RequestParam("compiler_id") Integer compilerId, @RequestParam("bear_id") Integer bearId, @RequestParam("enabled") Boolean enabled) {

compilBearRepository.setShowed(enabled, compilerId.shortValue(), bearId);

}

}

Приложение 6

Листинг конфигурации контекста безопасности приложения

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

private DataSource dataSource;

@Autowired

public SecurityConfig(DataSource dataSource) {

this.dataSource = dataSource;

}

@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers("/admin/**").hasAuthority("ADMIN")

.antMatchers("/**").hasAnyAuthority("USER", "ADMIN")

.and().httpBasic()

.and().csrf().disable();

}

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

auth.jdbcAuthentication().dataSource(dataSource)

.usersByUsernameQuery("select rtrim(login), rtrim(pwd), 1 from authors where login=?")

.authoritiesByUsernameQuery("select rtrim(login), rtrim(case sec" +

" when 1 then 'MASTER' when 2 then 'ADMIN' else 'USER' end)" +

" from authors left join author_sec" +

" on authors.id_publ=author_sec.id_publ" +

" where login=?")

.passwordEncoder(NoOpPasswordEncoder.getInstance());

}

}

Приложение 7

Листинг JavaScript-программы, управляющей списком ошибок на странице просмотра

ts(['$color_lang']);

var issues_loaded = false;

var originalCode;

var highlightedCode;

var currentCode;

var issues;

function googleSectionalElementInit() {

new google.translate.SectionalElement({

sectionalNodeClassName: 'goog-trans-section',

controlNodeClassName: 'goog-trans-control',

background: 'trasparent'

}, 'google_sectional_element');

}

$( function() {

originalCode = $(".$color_lang");

initHighlighting.apply(null, ['$color_lang']);

currentCode = highlightedCode = $(".$color_lang");

$( "#accordion" ).accordion({

collapsible: true,

active: false,

heightStyle: "content",

activate: function (e, ui) {

if(ui.newHeader.length>0){

if(!issues_loaded==1){

$.getJSON("/sas/issues?stat_id=$id_stat", function(data) {

issues = data;

var items = [];

$.each( data, function( key, val ) {

items.push( "<a href='#' id='issue-" + key + "' class='issue-text'>" + val.message + "</a><br/>" );

});

$(ui.newHeader[0]).next().html(items.join( "" ));

issues_loaded=true;

});

}

} else {

currentCode.replaceWith(highlightedCode);

currentCode = highlightedCode;

}

}

});

$('#accordion').on('click', 'a', function(event){

var issue = issues[event.target.id.substr(6)];

var code = originalCode.clone();

var content = code.html();

var startIndex = 0;

var i = 0;

while (i < issue.startLine) {

var eolIndex = content.indexOf('\n', startIndex);

if (eolIndex == -1) {

startIndex = content.length;

break;

}

startIndex = eolIndex + 1;

i++;

}

if (issue.startCol != null) {

startIndex += issue.startCol;

}

var endIndex = 0;

i = 0;

while (i < issue.endLine) {

var eolIndex = content.indexOf('\n', endIndex);

if (eolIndex == -1) {

break;

}

endIndex = eolIndex + 1;

i++;

}

if (issue.endCol != null) {

endIndex += issue.endCol;

} else {

endIndex = content.indexOf('\n', endIndex);

if (endIndex == -1) {

endIndex = content.length;

}

}

var contentBeforeHighlightText = content.substr(0, startIndex);

var contentAfterHighlightText = content.substr(endIndex + 1);

var highlightedText = "<span class=\"highlight-issue\">" + content.substring(startIndex, endIndex + 1) + "</span>";

content = contentBeforeHighlightText + highlightedText + contentAfterHighlightText;

code.html(content);

currentCode.replaceWith(code);

currentCode = code;

});

});

Приложение 8

Листинг JavaScript-программы, управляющей панелью администрирования модулей статического анализа

$( function() {

var compilers;

$.getJSON("/sas/admin/bears", function(data) {

compilers = data;

var items = [];

items.push("<table border=\"1\"><tr><td>Compiler</td><td>Checkers</td></tr>");

$.each( compilers, function( key, compiler ) {

items.push( "<tr><td><p>" + compiler.compilerName + "</td><td><input type=\"button\" class=\"compiler\" id=\"compiler-" + compiler.id + "\" value=\"Show\"/>");

items.push("<div style=\"display:none\" id=\"bears-" + compiler.id + "\"><table border=\"1\"><tr><td>Checker</td><td>Enabled</td><td>Showed</td></tr>");

$.each( compiler.bears, function( key, bear ) {

items.push("<tr><td>" + bear.bearName + "</td><td><input type=\"checkbox\" class=\"enabled\" id=\"enabled-" + compiler.id + "-" + bear.id + "\" value=\"Enabled\"" + (bear.enabled ? " checked" : "") + "/>");

items.push("<td><input type=\"checkbox\" class=\"showed\" id=\"showed-" + compiler.id + "-" + bear.id + "\" value=\"Showed\"" + (bear.showed ? " checked" : "") + "/></tr>");

});

items.push("</table></div></td></tr>")

});

items.push("</table>");

$("#static-analysis").html(items.join( "" ));

});

$("#static-analysis").on("click", ".compiler", function(event){

if (event.target.value == "Show") {

$("#bears-" + event.target.id.substr(9)).show();

event.target.value = "Hide";

} else {

$("#bears-" + event.target.id.substr(9)).hide();

event.target.value = "Show";

}

});

$("#static-analysis").on("change", ".enabled", function(event){

var substr = event.target.id.substr(8);

var delimiterIndex = substr.indexOf("-");

$.post("/sas/admin/analysis-state?compiler_id=" + substr.substring(0, delimiterIndex) + "&bear_id=" + substr.substr(delimiterIndex + 1) + "&enabled=" + event.target.checked);

});

$("#static-analysis").on("change", ".showed", function(event){

var substr = event.target.id.substr(7);

var delimiterIndex = substr.indexOf("-");

$.post("/sas/admin/showing-state?compiler_id=" + substr.substring(0, delimiterIndex) + "&bear_id=" + substr.substr(delimiterIndex + 1) + "&enabled=" + event.target.checked);

});

});

Приложение 9

Пример обнаруживаемых ошибок

Исходный текст программы на Java:

public class IntArrayList {

int[] arrInt;

int size;

static final int MAX_VALUE = 2147483647;

IntArrayList() {

this.arrInt = new int[500];

this.size = 0;

}

public IntArrayList(int initialCapacity) {

try {

this.arrInt = new int[initialCapacity];

this.size = 0;

} catch (IllegalArgumentException e) {

e.printStackTrace();

}

}

public boolean add(int value) {

try {

if (this.isFull()) {

arrInt = copyToArray();

}

arrInt[size] = value;

size++;

return true;

} catch (IllegalArgumentException e) {

e.printStackTrace();

}

throw new IllegalArgumentException();

}

public void add(int index, int value) {

if (size >= index && index >= 0) {

if (size == index) {

try {

if (this.isFull()) {

arrInt = copyToArray();

}

arrInt[size] = value;

size++;

return;

} catch (IllegalArgumentException e) {

e.printStackTrace();

}

}

try {

if (this.isFull()) {

arrInt = copyToArray();

}

offset(index);

arrInt[index] = value;

size++;

} catch (IllegalArgumentException e) {

e.printStackTrace();

}

} else throw new IndexOutOfBoundsException();

}

public int get(int index) {

if (size > index && index >= 0) {

return arrInt[index];

} else throw new IllegalArgumentException();

}

public int set(int index, int value) {

int last = 0;

if (size > index && index >= 0) {

try {

last = arrInt[index];

arrInt[index] = value;

return last;

} catch (IllegalArgumentException e) {

e.printStackTrace();

}

}

throw new IndexOutOfBoundsException();

}

public int size() {

return this.size;

}

public void clear() {

size = 0;

}

private boolean isFull() {

if (size == arrInt.length) {

return true;

}

return false;

}

private int[] copyToArray() {

int[] temp;

if ((double) (MAX_VALUE / arrInt.length) > 1.0) {

temp = new int[arrInt.length * 2];

} else {

temp = new int[arrInt.length + (MAX_VALUE - arrInt.length)];

}

int length = arrInt.length;

for (int i = 0; i < length; i++) {

temp[i] = arrInt[i];

}

return temp;

}

private void offset(int index) {

int length = size - index;

for (int i = 0; i < length; i++) {

arrInt[size - i] = arrInt[size - i - 1];

}

}

}

Рисунок 10 - Результаты статического анализа программы на Java

Исходный текст программы на C++:

#include <iostream>

#include <stdlib.h>

#include <time.h>

#include <string>

using namespace std;

bool razd (char s)

{ if ( s==' ' || s==',' || s==';' || s=='.' ||s=='?' ||s=='!' || s==':')

return(true);

else return(false);

}

string del(string s, int n)

{ int i=0; string sl;

for (int j=0;j<=n;j++)

{

while(razd(s[i]))

i++;

if (j==n-1)

while (!razd(s[i]) && i<s.length())

{

s.erase(i,1);

}

while (!razd(s[i]) && i<s.length() )

i++;

}

return(s);

}

int main()

{

string s;

getline(cin,s);

int n;

cin>>n;

cout<<del(s,n);

return(0);

}

Рисунок 11 - Результаты статического анализа программы на C++

Размещено на Allbest.ru


Подобные документы

  • Фаза "избавления" программы от ошибок. Задача обработки ошибок в коде программы. Ошибки с невозможностью автоматического восстановления, оператор отключения. Прекращение выполнения программы. Возврат недопустимого значения. Директивы РНР контроля ошибок.

    учебное пособие [62,3 K], добавлен 27.04.2009

  • Решение задач синтаксического анализа простой программы. Алгоритм нахождения синтаксических ошибок в ее тексте. Вывод данных о местоположении ошибки. Проектирование программы анализа арифметического выражения и методы проверки его на сумму или разность.

    курсовая работа [2,6 M], добавлен 01.07.2011

  • Рaзрaботка программного приложения (синтаксического aнaлизaторa), которое производит проверку синтaксисa простейшей программы на языке С++. Процедура проверки арифметических и логический выражений. Механизм удаления всех фиктивных переменных из программы.

    курсовая работа [27,2 K], добавлен 28.06.2011

  • Методы статического и динамического анализа зависимостей по данным для последовательных программ. Разработан и реализован алгоритм гибридного анализа, объединяющий достоинства обоих методов. Статическая библиотека представления базы данных САПФОР.

    дипломная работа [169,6 K], добавлен 21.11.2010

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

    отчет по практике [311,1 K], добавлен 27.05.2014

  • Анализ уязвимостей в многопоточных программах, написанных на языке С++. Создание программного обеспечения, выполняющего анализ многопоточных программ, написанных на С++, на предмет наличия в них ошибок синхронизации типа "гонки" и "заброшенные замки".

    курсовая работа [755,9 K], добавлен 20.09.2016

  • Разработка технологии обработки информации, структуры и формы представления данных. Проектирование программных модулей. Блок-схема алгоритма и исходный код программы анализа арифметического выражения, синтаксического анализа простой программы на языке С.

    курсовая работа [2,4 M], добавлен 12.12.2011

  • Создание программного обеспечения для эмулирования виртуальной рабочей среды для сборки, отладки и проверки функционирования устройств на базе цифровых интегральных микросхем. Возможности применения программы в учебном процессе, ее характеристики.

    курсовая работа [2,2 M], добавлен 09.06.2010

  • Алгоритм функции формирования и проверки подписи. Интерфейс как аппаратная или программная система сопряжения объектов с различными характеристиками. Разработка программы, которая реализует процедуру подписи сообщения и процедуру проверки подписи.

    курсовая работа [150,0 K], добавлен 13.11.2009

  • Общая характеристика задач фиксации времени выполнения программ: выполнение процессов реального времени, профилирование. Программируемый интервальный таймер как весьма сложная система. Анализ основных функций, возвращающих стандартное время Windows.

    курсовая работа [82,7 K], добавлен 18.05.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.